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

如何将pandas日度DataFrame转换为月度最大值的平均值?

问题描述

现有存储1973-2013年日降雨量数据的DataFrame,时间为索引,仅tp1一列存储降雨量数值,结构示例如下:

tp1
time           
1973-04-01  0.1
1973-07-01  0.4
1973-08-01  0.0
1973-12-01  0.5
1973-01-17  0.0
        ...
2013-10-09  0.0
2013-11-09  0.2
2013-12-09  0.0
2013-09-13  0.4
2013-09-14  0.0

[6432 rows x 1 columns]

计算目标:

  • 先统计每一年每个自然月的日降雨量最大值
  • 再对所有年份同月份的月度最大值取平均,最终输出12行结果,列名为Average of Maximum Daily Rainfall in each Month,行索引为月份英文缩写,格式参考如下:
Average of Maximum Daily Rainfall in each Month
Jan       x
Feb       x
March     x 
April     x
May       x
June      x
Jul       x
....

已尝试执行data = df.groupby(df.index.month).max(),返回结果为所有年份对应月份的全局最大值,不符合预期。

正确实现方案

核心逻辑是做两层分组聚合:第一层按「年份+月份」分组,计算每个独立自然月的日降雨量最大值;第二层仅按月份分组,对所有年份的同月份月度最大值求平均。

可直接运行的代码

# 第一层分组:按年、月维度拆分,计算每个月的日降雨量最大值
monthly_max = df.groupby([df.index.year, df.index.month])['tp1'].max()

# 第二层分组:按月份维度聚合,计算多年月度最大值的平均值
result = monthly_max.groupby(level=1).mean()

# 格式化输出:将数字月份替换为英文缩写,设置指定列名
month_map = ['Jan', 'Feb', 'March', 'April', 'May', 'June', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
result.index = [month_map[month_num - 1] for month_num in result.index]
result = result.to_frame('Average of Maximum Daily Rainfall in each Month')

原有写法问题说明

单层级按月份分组后直接调用max(),会直接取所有年份该月份下全部日数据的最大值,也就是跨年份的全局月极值,跳过了「先按年拆分计算每个自然月最大值」的步骤,因此结果不符合要求。

内容的提问来源于stack exchange,提问作者jw99

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:39:19