熊猫滚动groupby时间序列数据

时间:2017-01-23 03:13:17

标签: python pandas dataframe group-by

我有found a few个相关问题,但似乎都没有做到这一点。我想要一个与this类似的实现,但需要使用pandas数据帧结构。下面我将创建整个2016年的样本数据,其中包含366行。

import pandas as pd
import numpy as np   
dates=pd.date_range('2016-01-01','2016-12-31')    
random_data=np.random.randn(len(dates))
data=pd.DataFrame(random_data,index=dates,columns=['Test'])   

我想使用groupby每2天获取接下来的5天数据。普通groupby没有重叠的时间帧;投入2天的分组将给我183(366/2)组有两天数据。组合5天将给我约74(366/5)组,每组5天。我想要183组,每组五天。

如果不清楚,请提前抱歉。这就是我想要的:

            Test
2016-02-08  1.073696
2016-02-09  1.169865
2016-02-10  1.421454
2016-02-11 -0.576036
2016-02-12 -1.066921

            Test
2016-02-10  1.421454
2016-02-11 -0.576036
2016-02-12 -1.066921
2016-02-13  2.639681
2016-02-14 -0.261616

这是data.groupby(pd.TimeGrouper('2d'))

的结果
            Test
2016-02-08  1.073696
2016-02-09  1.169865
            Test
2016-02-10  1.421454
2016-02-11 -0.576036
            Test
2016-02-12 -1.066921
2016-02-13  2.639681

这是data.groupby(pd.TimeGrouper('5d'))

的结果
            Test
2016-02-08  0.898029
2016-02-09 -0.905950
2016-02-10 -0.202483
2016-02-11  1.073696
2016-02-12  1.169865
                Test
2016-02-13  1.421454
2016-02-14 -0.576036
2016-02-15 -1.066921
2016-02-16  2.639681
2016-02-17 -0.261616

1 个答案:

答案 0 :(得分:2)

如果日期是正常序列,并且样本数据显示为一天,则可以使用索引来获取行。 从每两行开始,为每个选择选择五行:

[data.iloc[i:(i+5)] for i in range(0, len(data), 2)]

#[                Test
# 2016-01-01  0.450173
# 2016-01-02 -0.496819
# 2016-01-03  0.270781
# 2016-01-04 -0.207634
# 2016-01-05  1.032061,                 
#                 Test
# 2016-01-03  0.270781
# 2016-01-04 -0.207634
# 2016-01-05  1.032061
# 2016-01-06 -0.470462
# 2016-01-07 -1.077634, ...]