如何基于含重复模式的DataFrame按月小时聚合中位数绘制热力图
实现方法
1. 数据预处理
先把字符串格式的日期列转为pandas时间类型,提取月份作为分组维度:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 按原始数据的月/日/年格式解析日期 df['date'] = pd.to_datetime(df['date'], format='%m/%d/%Y') # 提取月份字段 df['month'] = df['date'].dt.month
2. 聚合计算中位数
按小时、月份两个维度分组,计算每组value的中位数,再转为热力图需要的二维宽表结构:
# 分组聚合后转换结构:行索引为小时,列索引为月份,值为对应中位数 heatmap_data = df.groupby(['hour', 'month'])['value'].median().unstack()
若存在月份和小时的组合无数据,可在
unstack()后追加.fillna(0)补全缺失值,避免热力图出现空白。
3. 绘制热力图
基于聚合完成的二维表直接绘图,按要求设置坐标轴标签即可:
plt.figure(figsize=(12, 8)) sns.heatmap(heatmap_data, cmap='viridis') plt.xlabel('月份') plt.ylabel('日内小时序号') plt.title('各月逐小时value中位数热力图') plt.show()
注意事项
- 若需要调整坐标轴排序,可在聚合后通过
reindex方法手动指定月份、小时的排列顺序。 - 热力图配色可通过修改
cmap参数自定义,常用可选值包括coolwarm、YlGnBu、RdYlGn等。 - 如果需要在热力格中显示具体数值,可在
sns.heatmap中传入参数annot=True。
内容的提问来源于stack exchange,提问作者Matias Vidal
相关产品推荐
相关产品推荐

