Pandas逐行计算对应日期过去3个月的数值列均值方法
实现方法
核心逻辑
使用pandas自带的时间滚动窗口功能实现需求,无需手动构造广播矩阵,步骤如下:
- 转换日期格式:将int64类型的
Date列转换为datetime类型,为时间窗口计算做准备 - 数据排序:按日期升序排列,保证时间窗口计算的正确性
- 滚动均值计算:设置3个月的时间窗口,仅统计当前日期之前的数值计算均值
- 可选:删除包含NaN的结果行
完整可运行代码
import pandas as pd # 构造示例数据,你可以替换为自己的DataFrame df = pd.DataFrame({ 'Date': [20010425, 20010112, 20010308, 20010527, 20010620], 'Value': [1, 4, 3, 5, 2] }) # 1. 转换日期格式 df['Date'] = pd.to_datetime(df['Date'], format='%Y%m%d') # 2. 按日期排序 df = df.sort_values('Date', ignore_index=True) # 3. 设置日期为索引,用于时间滚动窗口计算 df = df.set_index('Date') # 4. 计算过去3个月的均值,closed='left'表示不包含当前行的Value # 若需要固定90天窗口,将window参数改为'90D'即可 df['Mean_Value_past_3_months'] = df['Value'].rolling( window='3ME', closed='left' ).mean() # 5. 恢复Date为普通列 df = df.reset_index() # 可选:删除包含NaN的行 df = df.dropna(subset=['Mean_Value_past_3_months'], ignore_index=True) print(df)
参数说明
window='3ME':表示窗口长度为3个自然日历月,会自动适配不同月份的天数差异,若你需要固定90天的统计范围,替换为window='90D'即可closed='left':保证计算均值时仅统计当前日期之前的数值,不会把当前行的Value算入结果,符合你的需求mean()方法默认自动忽略NaN值,无需额外处理
内容的提问来源于stack exchange,提问作者katawa
相关产品推荐
相关产品推荐

