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

已按月聚合Pandas时间序列,如何高效实现6个月滚动均值?

解决方案

针对你的需求,有两种更简洁的实现方式,取决于你想要的是月度均值的6个月滚动平均还是基于原始数据的6个月滚动窗口均值(按月度对齐):

方式一:先计算月度均值,再做6个月滚动平均

这是最贴合你原始需求的方案——先得到每个月的价格均值,再对这些月度数据做6期滚动平均(覆盖过去6个月的均值):

import pandas as pd

# 1. 计算月度均值
monthly_mean = df.groupby(pd.Grouper(key='transaction_date', freq='M')).agg(
    transaction_date=('transaction_date', 'first'),
    price_mean=('price', 'mean')
).reset_index(drop=True)

# 2. 对月度均值做6个月滚动平均
monthly_mean['price_rolling_6M'] = monthly_mean['price_mean'].rolling(window=6, min_periods=1).mean()

这里window=6对应6个月度周期,min_periods=1保证即使不足6个月的开头数据也能计算均值(可根据需求调整)。

方式二:直接基于原始数据计算6个月滚动窗口均值(按月度对齐)

如果你想要的是每个时间点(或每个月)对应的过去6个月所有原始数据的均值,可以直接用rolling结合时间窗口参数'6M',无需先按天/月聚合:

import pandas as pd

# 设置datetime索引并排序
df = df.set_index('transaction_date').sort_index()

# 计算6个月滚动均值,按月度对齐输出结果
rolling_6M = df['price'].rolling(window='6M').mean().resample('M').last()

你之前尝试中的问题说明

  1. 使用timedelta(days=1)作为rolling窗口报错:因为用时间偏移量作为窗口时,需确保索引是datetime类型,且建议使用pd.Timedelta(days=1)而非Python内置的timedelta对象。
  2. 最后一段可行代码的逻辑瑕疵:df['price'].rolling(window=180)是对原始数据做180天滚动,而非聚合后的日度均值,且固定天数不如'6M'时间窗口准确(不同月份天数存在差异)。

内容的提问来源于stack exchange,提问作者user2138149

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:51:13