You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:02:27