如何基于datetime列生成月/小时组合计数的热力图?
月-小时事件计数热力图实现方案
问题背景
你的数据集created_at列是UTC格式的字符串时间,需要生成x轴为1-23小时、y轴为1-12月份的热力图,展示每个月-小时组合的事件计数。
错误分析
你原代码的核心问题:
grouped.rename(columns={"Hour":"Count"})未重新赋值,导致后续无法引用Count列- 分组计数后无需再用
pivot_table,直接转换为二维表格即可
正确实现步骤
1. 转换时间格式并提取月/小时字段
先一次性将字符串时间转为datetime类型,避免重复计算:
# 转换为datetime类型(UTC格式会自动识别) df['created_at'] = pd.to_datetime(df['created_at']) # 提取月份(1-12)和小时(0-23,若需1-23则加1) df['Month'] = df['created_at'].dt.month df['Hour'] = df['created_at'].dt.hour # 若要1-23小时,改为df['created_at'].dt.hour + 1
2. 生成月-小时计数的二维表格
推荐两种简便方法:
方法一:直接用crosstab生成(最快捷)
# 直接统计每个月-小时的事件数,缺失组合自动填充0 heatmap_data = pd.crosstab(df['Month'], df['Hour'])
方法二:分组计数后转二维表格
# 按月份和小时分组,统计每组数量 grouped_counts = df.groupby(['Month', 'Hour']).size() # 转换为二维表格,缺失的月-小时组合填充0 heatmap_data = grouped_counts.unstack(fill_value=0)
3. 绘制热力图
使用seaborn绘制带数值标注的热力图:
import seaborn as sns import matplotlib.pyplot as plt # 设置画布大小 plt.figure(figsize=(14, 7)) # 绘制热力图,cmap可选配色,annot显示数值,fmt指定整数格式 sns.heatmap(heatmap_data, cmap='Blues', annot=True, fmt='d', xticklabels=range(1, 24), # x轴显示1-23 yticklabels=range(1, 13)) # y轴显示1-12 # 设置轴标签和标题 plt.xlabel('小时') plt.ylabel('月份') plt.title('各月份不同小时的事件计数热力图') # 展示图表 plt.show()
内容的提问来源于stack exchange,提问作者evilmandarine
相关产品推荐
相关产品推荐

