如何用Python将分年龄段月度数据转为年度平均值?
正确实现方法及提示
你的代码核心问题
你错误地将Age group列转换为日期类型了,这完全不符合逻辑——日期信息应该来自数据里的日期列(从你提供的截图看,原数据有REF_DATE列,这才是存放日期的字段)。
两种正确的Python实现方式
方法1:按年份+年龄段分组计算
这是最直观的方式,适合明确提取年份的场景:
import pandas as pd # 读取数据时直接解析日期列,避免后续转换出错 df = pd.read_csv('1410001701eng.csv', parse_dates=['REF_DATE']) # 从日期列提取年份 df['year'] = df['REF_DATE'].dt.year # 按「年份+年龄段」分组,计算对应VALUE的年度平均值 yearly_age_avg = df.groupby(['year', 'Age group'])['VALUE'].mean().reset_index() print(yearly_age_avg)
方法2:用resample处理时间序列
如果你的数据是标准时间序列格式,resample会更贴合时间维度的操作逻辑:
import pandas as pd df = pd.read_csv('1410001701eng.csv', parse_dates=['REF_DATE']) # 将日期列设为索引,方便resample操作 df.set_index('REF_DATE', inplace=True) # 按年龄段分组后,以年为频率重采样并计算平均值 yearly_age_avg = df.groupby('Age group')['VALUE'].resample('Y').mean().reset_index() # 把重采样后的日期转成年份,让结果更清晰 yearly_age_avg['year'] = yearly_age_avg['REF_DATE'].dt.year yearly_age_avg.drop('REF_DATE', axis=1, inplace=True) print(yearly_age_avg)
关键提示
- 必须确保日期列被正确解析为datetime类型,读取数据时用
parse_dates参数指定日期列,比后续手动转换更可靠。 - 一定要同时按年份和年龄段分组,否则会把所有年龄段的数据混在一起计算,得到的不是分年龄段的年度平均。
- 2022年只有11个月的数据,
mean()会自动计算这11个月的平均值,符合需求;如果某年份有缺失月份,可以根据实际情况用fillna()填充缺失值,或者用dropna()剔除无效行。 - 用
df['日期列'].dt.year提取年份比DatetimeIndex写法更简洁易懂。
Excel手动计算是否合适?
完全不推荐。44年的数据,每个年龄段每年都要计算月度平均值,手动操作不仅效率极低,还容易出现计算错误;而且后续如果数据更新或需要重复计算,还要重新操作一遍。Python代码只需要写一次,就能快速准确地完成计算,还能保留操作记录,可复用性远高于手动计算。
内容的提问来源于stack exchange,提问作者businesstoe
相关产品推荐
相关产品推荐

