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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:55:26