熊猫:如何在过去几天计算变量的滚动总和,但仅限于给定的小时?

时间:2016-09-12 19:28:52

标签: python pandas

我有一个数据框如下

df = pd.DataFrame({ 'X' : np.random.randn(50000)}, index=pd.date_range('1/1/2000', periods=50000, freq='T'))

df.head(10)
Out[37]: 
                            X
2000-01-01 00:00:00 -0.699565
2000-01-01 00:01:00 -0.646129
2000-01-01 00:02:00  1.339314
2000-01-01 00:03:00  0.559563
2000-01-01 00:04:00  1.529063
2000-01-01 00:05:00  0.131740
2000-01-01 00:06:00  1.282263
2000-01-01 00:07:00 -1.003991
2000-01-01 00:08:00 -1.594918
2000-01-01 00:09:00 -0.775230

我想创建一个包含X {/ p>的sum的变量

  • 过去5天(不包括当前观察
  • 仅考虑与当前观察时间完全相同的观察结果。

换句话说:

  1. 在索引2000-01-01 00:00:00df['rolling_sum_same_hour']包含数据中过去5天内00:00:00处观察到的X值的总和(当然不包括2000-01-01)。
  2. 在索引2000-01-01 00:01:00df['rolling_sum_same_hour']包含过去5天内在00:00:01观察到的X的总和,依此类推。
  3. 直观的想法是盘中价格具有盘中季节性,我想以这种方式摆脱它。

    我尝试使用df['rolling_sum_same_hour']=df.at_time(df.index.minute).rolling(window=5).sum()

    没有成功。 有什么想法吗?

    非常感谢!

2 个答案:

答案 0 :(得分:3)

看到groupby的力量!

df = # as you defined above
df['rolling_sum_by_time'] = df.groupby(df.index.time)['X'].apply(lambda x: x.shift(1).rolling(10).sum())

它是吞下那里的大药丸,但我们按时间分组(如python datetime.time),然后获取我们关心的列(否则apply将在列上工作 - 它现在适用于时间-groups),然后应用你想要的功能!

答案 1 :(得分:2)

IIUC,您想要的是执行滚动总和,但仅限于按照完全相同的时间分组的观察结果。这可以通过

来完成
isOpen

(请注意,您的问题会在5到10个句点之间交替出现。)例如:

df.X.groupby([df.index.hour, df.index.minute]).apply(lambda g: g.rolling(window=5).sum())