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

如何使用Pandas为DataFrame计算基于date列的1年滚动平均值?

按ID计算1年滚动平均值的实现方案

我来帮你搞定这个需求!要给test DataFrame里每个ID计算每行的1年滚动平均值,咱们分几步来,确保结果准确:

第一步:先把数据理清楚

首先得保证时间列是正确的格式,而且每个ID的时间序列是有序的——毕竟滚动窗口得按时间顺序来算才合理:

import pandas as pd

# 把date列转成datetime类型,不然没法做时间窗口计算
test['date'] = pd.to_datetime(test['date'])

# 按ID分组,每个ID内部按日期升序排序(从早到晚)
test = test.sort_values(by=['id', 'date'])

第二步:分组计算滚动平均值

用groupby结合rolling的时间窗口功能,就能轻松实现按ID单独计算过去1年的均值:

# 新增一列存储1年滚动平均值
test['rolling_1y_mean'] = test.groupby('id')['variation'].rolling(
    window='365D',  # 窗口范围是过去365天,也可以用'1Y',根据需求选择
    on='date'       # 指定用date列作为时间基准
).mean().reset_index(level=0, drop=True)

关键细节说明:

  • groupby('id'):确保每个ID的滚动计算独立,不会和其他ID的数据混在一起
  • window='365D':表示取当前日期往前推365天内的所有数据来算均值,注意闰年场景可能差一天,可根据业务需求调整
  • on='date':告诉pandas用哪一列作为时间窗口的依据
  • reset_index(...):把分组产生的ID索引去掉,让计算结果能和原DataFrame完美对齐

小提示

如果你的原始数据是按日期降序排列的(比如示例里的日期是从新到旧),那排序的时候改成sort_values(by=['id', 'date'], ascending=[True, False])就行,滚动窗口会自动适配顺序。另外,如果某一行往前365天内没有数据,对应的滚动平均值会是NaN,这是正常的,你可以根据需求用fillna()做后续处理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:05:28