已按月聚合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()
你之前尝试中的问题说明
- 使用
timedelta(days=1)作为rolling窗口报错:因为用时间偏移量作为窗口时,需确保索引是datetime类型,且建议使用pd.Timedelta(days=1)而非Python内置的timedelta对象。 - 最后一段可行代码的逻辑瑕疵:
df['price'].rolling(window=180)是对原始数据做180天滚动,而非聚合后的日度均值,且固定天数不如'6M'时间窗口准确(不同月份天数存在差异)。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

