如何使用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
相关产品推荐
相关产品推荐

