绘图中Datetime对象处理问题:Seaborn热力图报KeyError: 'month'
解决Seaborn热力图绘制中的KeyError问题及Datetime索引处理方法
问题原因
出现KeyError: 'month'是因为分组后的monthly_means_per_year中,year和month是多级索引的级别名称,并非DataFrame的列字段,因此pivot方法无法将它们识别为列参数。
修正方案(两种可选)
方案1:将年月转为DataFrame列后透视
这种方式更直观,适合习惯使用pivot的场景:
# 从Datetime索引提取年月作为新列 airquality_athen['year'] = airquality_athen.index.year airquality_athen['month'] = airquality_athen.index.month # 按年月分组计算NO2均值,同时将索引转为列 monthly_means_per_year = airquality_athen.groupby(['year', 'month'])['NO2'].mean().reset_index() # 转换为热力图所需的行列格式:行=月份,列=年份,值=NO2均值 heatmap_data = monthly_means_per_year.pivot(index='month', columns='year', values='NO2') # 绘制符合目标风格的热力图 import seaborn as sns import matplotlib.pyplot as plt ax = sns.heatmap(heatmap_data, annot=True, fmt=".1f", cmap="YlGnBu") plt.xlabel('年份') plt.ylabel('月份') plt.title('各年月NO2均值热力图') plt.show()
方案2:利用多级索引直接展开(更高效)
通过unstack直接将多级索引的某一级转为列,无需额外处理:
year = airquality_athen.index.year.rename("year") month = airquality_athen.index.month.rename("month") # 仅计算NO2的均值,减少不必要的计算 monthly_means_per_year = airquality_athen.groupby([year, month])['NO2'].mean() # 将year索引级别展开为列,得到热力图所需格式 heatmap_data = monthly_means_per_year.unstack(level='year') # 绘制匹配目标样式的热力图 ax = sns.heatmap(heatmap_data, annot=True, fmt=".1f", cmap="YlGnBu") plt.show()
关键说明
- 目标热力图的核心特征是显示数值标注(
annot=True)、指定数值格式(fmt=".1f")和使用渐变配色(cmap="YlGnBu"),上述代码已包含这些配置 - 如果需要绘制O3的热力图,只需将代码中的
NO2替换为O3即可
内容的提问来源于stack exchange,提问作者user19941705
相关产品推荐
相关产品推荐

