我有DataFrame
:
A
2016-01-01 00:00:00 0
2016-01-01 12:00:00 1
2016-01-02 00:00:00 2
2016-01-02 12:00:00 3
2016-01-03 00:00:00 4
2016-01-03 12:00:00 5
2016-01-04 00:00:00 6
2016-01-04 12:00:00 7
2016-01-05 00:00:00 8
2016-01-05 12:00:00 9
我将 2016-01-02 00:00:00 分开到 2016-01-03 12:00:00 的原因是,这两天是周末
所以这就是我想做的事情:
我希望rolling_sum
与window = 2 business days
。
例如,我希望总结
A
2016-01-04 00:00:00 6
2016-01-04 12:00:00 7
2016-01-05 00:00:00 8
2016-01-05 12:00:00 9
然后总结(我们跳过任何非工作日)
A
2016-01-01 00:00:00 0
2016-01-01 12:00:00 1
2016-01-04 00:00:00 6
2016-01-04 12:00:00 7
结果是
A
2016-01-01 Nan
2016-01-04 14
2016-01-05 30
我怎样才能做到这一点?
我试过rolling_sum(df, window=2, freq=BDay(1))
,似乎只是在同一天选择一行,但不是在同一天内将两行(00:00和12:00)相加。
答案 0 :(得分:1)
您可以先选择工作日,重新采样到(业务)每日频率以获取剩余数据点和总和,然后应用rolling_sum
:
从一些样本数据开始:
df = pd.DataFrame(data={'A': np.random.randint(0, 10, 500)}, index=pd.date_range(datetime(2016,1,1), freq='6H', periods=500))
A
2016-01-01 00:00:00 6
2016-01-01 06:00:00 9
2016-01-01 12:00:00 3
2016-01-01 18:00:00 9
2016-01-02 00:00:00 7
2016-01-02 06:00:00 5
2016-01-02 12:00:00 8
2016-01-02 18:00:00 6
2016-01-03 00:00:00 2
2016-01-03 06:00:00 0
2016-01-03 12:00:00 0
2016-01-03 18:00:00 0
2016-01-04 00:00:00 5
2016-01-04 06:00:00 4
2016-01-04 12:00:00 1
2016-01-04 18:00:00 4
2016-01-05 00:00:00 6
2016-01-05 06:00:00 9
2016-01-05 12:00:00 7
2016-01-05 18:00:00 2
....
首先在工作日选择值:
tsdays = df.index.values.astype('<M8[D]')
bdays = pd.bdate_range(tsdays[0], tsdays[-1]).values.astype('<M8[D]')
df = df[np.in1d(tsdays, bdays)]
然后将rolling_sum()
应用于重新采样的数据,其中每个值代表单个工作日的总和:
pd.rolling_sum(df.resample('B', how='sum'), window=2)
得到:
A
2016-01-01 NaN
2016-01-04 41
2016-01-05 38
2016-01-06 56
2016-01-07 52
2016-01-08 37