Python 熊猫:如何计算一个变量在过去几天内的滚动和,但仅在给定的时间?

Python 熊猫:如何计算一个变量在过去几天内的滚动和,但仅在给定的时间?,python,pandas,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:

我有一个如下的数据帧

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的
和的变量

  • 过去5天(不包括当前观察结果)
  • 仅考虑与当前观测时间完全相同的观测值
换言之:

  • 在索引
    2000-01-01 00:00:00
    df['rolling\u sum\u same\u hour']
    包含数据中过去5天
    00:00:00
    观察到的X值的总和(当然不包括
    2000-01-01
  • 在索引
    2000-01-01 00:01:00
    df['rolling\u sum\u same\u hour']
    包含过去5天内
    00:00:01
    观察到的X的总和,依此类推 直观的想法是,日内价格具有日内季节性,我想通过这种方式消除它

    我尝试使用
    df['rolling\u sum\u same\u hour']=df.at\u time(df.index.minute)。rolling(window=5.sum()

    没有成功。 有什么想法吗


    非常感谢

    看看群比的力量吧

    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将对列起作用-它现在对时间组起作用),然后应用您想要的函数

    IIUC,您要做的是执行滚动求和,但仅对按一天中完全相同的时间分组的观测值执行。这可以通过以下方式完成:

    df.X.groupby([df.index.hour, df.index.minute]).apply(lambda g: g.rolling(window=5).sum())
    
    (请注意,您的问题在5到10个句点之间交替出现。)例如:

    In [43]: df.X.groupby([df.index.hour, df.index.minute]).apply(lambda g: g.rolling(window=5).sum()).tail()
    Out[43]: 
    2000-02-04 17:15:00   -2.135887
    2000-02-04 17:16:00   -3.056707
    2000-02-04 17:17:00    0.813798
    2000-02-04 17:18:00   -1.092548
    2000-02-04 17:19:00   -0.997104
    Freq: T, Name: X, dtype: float64
    

    您可以尝试布尔索引:
    df['rolling\u sum\u same\u hour']=df[df.index.hour==16]。rolling(window=10.sum()
    。你可以让过滤器任意细化,以计算分钟、秒等,但它确实会变得冗长……mehIt不清楚。对于小时之间的行(例如:
    00:00
    01:00
    -
    ['00:01','00:02','00:02','00:59']
    ),您希望在
    rolling\u sum\u same\u hour
    列中有哪些值?@Noobie:更不用说我对您的建议没有问题了!嗨,伙计们,很抱歉我说的模棱两可。要点如下:对于数据中的每一行A,保留与当前观察A同时发生的过去n天的观察结果。我认为问题现在更清楚了。再次感谢你的帮助!谢谢@starfox,但我需要原始数据框中包含rollingsum列@Noobie:它应该和我刚做的编辑一样简单,除非我疯了,否则看起来很不错,也许除了我不应该考虑当前的观察之外。
    x.rolling(10).shift(1).sum()
    是否可以排除总和中的当前OB?更明确一点,如果忽略
    shift()
    ,2000-01-01到2000-01-10的滚动总和将出现在该2000-01-10。包括
    shift()
    ,1月1日至1月10日的滚动总和将出现在索引2000-01-11中。