Python计算月度气温均值并联合日值绘图的代码问题排查
近十年逐日气温数据的月度均值计算与联合可视化修正指南
核心问题缺陷定位
针对MonthMean函数逻辑存疑、绘图无显示的两个核心问题,对应常见代码缺陷如下:
- MonthMean函数的逻辑偏差
- 分组逻辑边界错误:多为手写循环判断月份变化的实现,未严格按「年-月」双维度聚合,遇到闰年2月、跨月数据时容易把相邻月份的逐日气温错归为一组
- 异常值未过滤:未剔除数据集中的缺失标记值(如-999、空值)直接计算平均,会导致月度结果出现极端偏离
- 月度序列无显示的绘图bug
- 坐标系统不匹配:计算完月度值后,x轴要么直接用数组索引、要么固定取每月1日的时间戳和原逐日的datetime类型x轴混用,导致序列点全部落在坐标轴可视范围外
- 图层遮挡:月度序列的绘图代码写在逐日曲线绘制逻辑之前,低密度的月度点被半透明的逐日曲线完全覆盖,视觉上等同于函数未执行
- 点位位置错误:未按要求把月度值对应到所属月份的中间位置,直接用月初坐标导致序列和轴刻度重叠,视觉上难以识别
可落地的修正实现
1. 重写无边界错误的MonthMean计算函数
直接依托pandas的聚合能力替代手写循环,从根源避免分组逻辑bug,代码实现如下:
import pandas as pd def get_monthly_tave(weather_daily_df): # 过滤DallasTX数据集中常见的缺失值(如低于-50℃的标记值) valid_daily = weather_daily_df[weather_daily_df['Tave'] > -50] # 按年、月双维度分组计算Tave均值 monthly_stats = valid_daily.groupby( [valid_daily['date'].dt.year, valid_daily['date'].dt.month] )['Tave'].mean().reset_index(names=['year', 'month']) # 生成对应月份中间位置的绘图时间戳:每月1号向后推半月时长 monthly_stats['plot_x'] = pd.to_datetime({ 'year': monthly_stats['year'], 'month': monthly_stats['month'], 'day': 1 }) + pd.to_timedelta( monthly_stats['month'].dt.days_in_month // 2, unit='d' ) return monthly_stats
2. 绘图逻辑修正
- 调整绘图顺序:先绘制半透明的逐日Tave曲线(设置alpha=0.3降低视觉权重),再绘制月度均值序列,通过
zorder参数把月度序列的图层优先级调高,避免被遮挡 - 统一x轴数据类型:所有绘图点的x值均使用datetime类型的时间戳,不要混用数值索引和时间对象
- 月度序列样式设置:用区分度较高的颜色(如深红色)、实心圆点标记展示月度均值,让读者可以直接对应到所属月份
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

