工作日的rolling_sum并返回以数据为索引的新数据框

时间:2016-02-01 16:02:47

标签: python pandas dataframe time-series

我有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_sumwindow = 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)相加。

1 个答案:

答案 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

请参阅[此处]了解类型转化,并1 [此问题] 2了解营业日提取情况。