如何用Pandas实现1分钟步长的5分钟滚动窗口计算?
解决你的Pandas滚动窗口求和问题
看起来你已经找对了方向,但默认的rolling方法输出的是逐行累加结果,和你需要的按1分钟步长、对应5分钟窗口总和且对齐到整分钟时间戳的需求不匹配。别担心,我们可以通过几个步骤调整来实现你的期望:
第一步:先把数据整理好
首先得确保时间列是正确的datetime类型,并且设为索引,这是时间序列处理的基础:
import pandas as pd # 转换rr_ms为datetime格式,然后设为索引 df['rr_ms'] = pd.to_datetime(df['rr_ms']) df = df.set_index('rr_ms')
第二步:计算5分钟滚动窗口的总和
这里要注意设置closed='left'参数,这样窗口的范围是[当前时间-5分钟, 当前时间),刚好覆盖你需要的前5分钟数据:
# 计算每个时间点对应的前5分钟time总和 rolling_total = df['time'].rolling('5T', closed='left').sum()
第三步:按1分钟步长提取结果
现在我们需要把逐行的结果转换成按1分钟频率输出,并且只保留每个整分钟点的最终窗口值——这一步用resample就能搞定:
# 重采样到1分钟,取每个分钟的最后一个有效总和值 final_result = rolling_total.resample('1T').last().dropna()
可选:调整时间戳(匹配你的期望格式)
如果你希望结果的时间戳刚好是窗口结束的整分钟(比如15:43-15:47的窗口对应15:48:00),上面的结果已经符合要求。如果需要微调时间戳,比如往后偏移1分钟,可以用shift:
# 可选:将所有时间戳向后偏移1分钟 final_result = final_result.shift(freq='1T')
看看最终结果
处理后的final_result会是你想要的格式:
2020-03-05 15:48:00+01:00 249022.0 2020-03-05 15:49:00+01:00 300041.0 ... Name: time, dtype: float64
为什么默认的rolling不对?
默认的rolling('5T').sum()会给原始数据的每一行都生成一个窗口总和,窗口是从该行时间往前推5分钟的所有数据,所以输出行数和原始数据一样多。而我们需要的是每1分钟输出一次,所以用resample('1T').last()把结果聚合到整分钟频率,只保留每个分钟的最后一个窗口值,就实现了步长1分钟、重叠4分钟的滚动窗口效果。
内容的提问来源于stack exchange,提问作者Marielle Dado
相关产品推荐
相关产品推荐

