在python

时间:2019-12-15 06:53:48

标签: python pandas pandas-groupby

如何选择数据框中的第5分钟行?如果缺少第5分钟,那么第4或第3分钟就可以了。

我不希望有任何平均值

我尝试过:

df.groupby(pd.TimeGrouper('5Min'))['AUDUSD'].mean()

df.resample('5min', how=np.var).head()

均未取得理想的结果。

我的输入

                        DATETIME            AUDUSD
DATETIME        
2019-06-07 00:01:00     2019.06.07 00:01    0.69740
2019-06-07 00:02:00     2019.06.07 00:02    0.69742
2019-06-07 00:03:00     2019.06.07 00:03    0.69742
2019-06-07 00:04:00     2019.06.07 00:04    0.69742
2019-06-07 00:05:00     2019.06.07 00:05    0.69739
2019-06-07 00:06:00     2019.06.07 00:06    0.69740
2019-06-07 00:07:00     2019.06.07 00:07    0.69739
2019-06-07 00:08:00     2019.06.07 00:08    0.69740
2019-06-07 00:11:00     2019.06.07 00:11    0.69741
2019-06-07 00:12:00     2019.06.07 00:12    0.69741
2019-06-07 00:13:00     2019.06.07 00:13    0.69740
2019-06-07 00:14:00     2019.06.07 00:14    0.69740
2019-06-07 00:15:00     2019.06.07 00:15    0.69754
2019-06-07 00:16:00     2019.06.07 00:16    0.69749
2019-06-07 00:17:00     2019.06.07 00:17    0.69752
2019-06-07 00:18:00     2019.06.07 00:18    0.69753
2019-06-07 00:19:00     2019.06.07 00:19    0.69758
2019-06-07 00:20:00     2019.06.07 00:20    0.69763
2019-06-07 00:21:00     2019.06.07 00:21    0.69764
2019-06-07 00:23:00     2019.06.07 00:23    0.69765
2019-06-07 00:28:00     2019.06.07 00:28    0.69763

所需的输出:

                        DATETIME            AUDUSD
DATETIME        
2019-06-07 00:05:00     2019.06.07 00:05    0.69739
2019-06-07 00:10:00     2019.06.07 00:08    0.69740
2019-06-07 00:15:00     2019.06.07 00:15    0.69754
2019-06-07 00:20:00     2019.06.07 00:20    0.69763
2019-06-07 00:25:00     2019.06.07 00:23    0.69765
2019-06-07 00:30:00     2019.06.07 00:28    0.69763

2 个答案:

答案 0 :(得分:2)

这对我有用,除了我首先使用,因为我不知道您使用什么方法:

df.set_index(pd.DatetimeIndex(df['DATETIME']))  

df.set_index(pd.DatetimeIndex(df['DATETIME'])).resample("5T").agg('first')                                                                                                          

Out[2649]: 
                             DATETIME   AUDUSD
DATETIME                                      
2019-06-07 00:00:00  2019.06.07 00:01  0.69740
2019-06-07 00:05:00  2019.06.07 00:05  0.69739
2019-06-07 00:10:00  2019.06.07 00:11  0.69741
2019-06-07 00:15:00  2019.06.07 00:15  0.69754
2019-06-07 00:20:00  2019.06.07 00:20  0.69763
2019-06-07 00:25:00  2019.06.07 00:28  0.69763

答案 1 :(得分:0)

首先,我们需要找出最后一分钟与最​​近的30分钟有多远,然后我们可以为索引和数据框重新编制索引,同时添加自定义的分钟数:

def custom_round(x, base=30):
    return int(base * round(float(x)/base))


mins_to_add = cumstom_round(df.index.minute[-1]) # assuming your index is a datetime.
#OR
mins_to_add = cumstom_round(df.DATETIME.minute[-1]) 


df2 = df.set_index('DATETIME').reindex(
      pd.date_range(
          df.DATETIME.min(), 
          df.DATETIME.max(), + pd.Timedelta(f'{mins_to_add}M') freq='1T', closed='left'
      ), 
      method='ffill'
)

print(df2.resample("5T").agg('first'))



                             DATETIME    AUDUSD
DATETIME                                        
2019-06-07 00:00:00 2019-06-07 00:01:00  0.69740
2019-06-07 00:05:00 2019-06-07 00:05:00  0.69739
2019-06-07 00:10:00 2019-06-07 00:08:00  0.69740
2019-06-07 00:15:00 2019-06-07 00:15:00  0.69754
2019-06-07 00:20:00 2019-06-07 00:20:00  0.69763
2019-06-07 00:25:00 2019-06-07 00:23:00  0.69765
2019-06-07 00:30:00 2019-06-07 00:28:00  0.69763