2016-02-01 33 views
0

返回新的數據幀我有這樣一個DataFrame:我分開2016年1月2日00:00:002016-01-rolling_sum在工作日與日期指數

     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 

原因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

你可以先只選擇工作日,重採樣(業務)每天頻率爲剩餘的數據點和求和,然後應用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