如何用Pandas计算每月最后14天的14天滚动均值
使用Pandas计算每年各月最后14天的滚动月末均值
需求说明
基于包含Month、Day、Year、Var1列的数据集,计算每年每个月份最后14天的滚动月末均值(即每个月最后一天的14天滚动均值,不足14天时用已有数据计算),最终输出每个月对应的结果。
样例数据
Month Day Year Var1 1 1 2022 8 1 2 2022 8 1 3 2022 17 1 4 2022 1 1 5 2022 10 1 6 2022 21 1 7 2022 9 1 8 2022 18 1 9 2022 18 1 10 2022 16 1 11 2022 2 1 12 2022 3 1 13 2022 24 1 14 2022 13 1 15 2022 4 1 16 2022 9 1 17 2022 2 1 18 2022 0 1 19 2022 22 1 20 2022 14 1 21 2022 14 1 22 2022 18 1 23 2022 22 1 24 2022 18 1 25 2022 5 1 26 2022 23 1 27 2022 13 1 28 2022 11 1 29 2022 7 1 30 2022 24 1 31 2022 15 2 1 2022 20 2 2 2022 19 2 3 2022 5 2 4 2022 5 2 5 2022 15 2 6 2022 8 2 7 2022 2 2 8 2022 20 2 9 2022 10 2 10 2022 12 2 11 2022 1 2 12 2022 20 2 13 2022 2 2 14 2022 7 2 15 2022 21 2 16 2022 5 2 17 2022 10 2 18 2022 9 2 19 2022 4 2 20 2022 13 2 21 2022 15 2 22 2022 25 2 23 2022 22 2 24 2022 14 2 25 2022 2 2 26 2022 12 2 27 2022 15 2 28 2022 19
期望最终结果
Month Year Last 14-day Rolling Mean 1 2022 13.86666667 2 2022 12.86666667
实现代码
import pandas as pd # 加载你的数据(如果是从文件读取,替换为pd.read_csv("your_file_path.csv")) # 这里用样例数据演示 data = { 'Month': [1]*31 + [2]*28, 'Day': list(range(1,32)) + list(range(1,29)), 'Year': [2022]*31 + [2022]*28, 'Var1': [8,8,17,1,10,21,9,18,18,16,2,3,24,13,4,9,2,0,22,14,14,18,22,18,5,23,13,11,7,24,15, 20,19,5,5,15,8,2,20,10,12,1,20,2,7,21,5,10,9,4,13,15,25,22,14,2,12,15,19] } df = pd.DataFrame(data) # 1. 创建完整日期列并确保数据按日期排序 df['Date'] = pd.to_datetime(df[['Year', 'Month', 'Day']]) df = df.sort_values('Date').reset_index(drop=True) # 2. 按年-月分组,计算每组内Var1的向前滚动均值(窗口14天,不足14天则用现有数据) df['Daily Rolling Mean'] = df.groupby(['Year', 'Month'])['Var1'].transform( lambda x: x.rolling(window=14, min_periods=1).mean() ) # 3. 提取每个月最后一行数据,整理为最终格式 final_df = df.groupby(['Year', 'Month'], as_index=False).last()[['Month', 'Year', 'Daily Rolling Mean']] final_df = final_df.rename(columns={'Daily Rolling Mean': 'Last 14-day Rolling Mean'}) # 查看结果 print(final_df)
代码说明
- 创建日期列:将
Year、Month、Day合并为标准日期格式,确保数据按时间顺序排列,避免滚动计算出错。 - 分组计算滚动均值:通过
groupby(['Year', 'Month'])确保只在每个月内部计算滚动均值,rolling(window=14, min_periods=1)表示使用14天窗口,数据不足14天时仍计算均值。 - 提取月末结果:通过
groupby(...).last()获取每个月最后一天的数据,重命名列后得到最终结果。
内容的提问来源于stack exchange,提问作者user2100039
相关产品推荐
相关产品推荐

