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

绘图中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:01:25