如何按月份绘制Calendar Heatmap?求助工具使用问题
按月拆分的日历热力图实现方案
数据预处理(解决July包转换错误)
July包对日期格式要求严格,先确保日期列是标准datetime64类型,清理缺失值:
import pandas as pd # 替换为你的数据读取方式,日期列名、值列名按需修改 df = pd.read_csv('sales_data.csv') df['sale_date'] = pd.to_datetime(df['sale_date'], errors='coerce') df = df.dropna(subset=['sale_date']) df['month'] = df['sale_date'].dt.to_period('M') # 生成月份分组标识
用July包生成单月热力图(循环批量生成)
预处理后,按月份拆分数据,补全当月所有日期(避免无销售日期缺失导致的绘制错误):
from july import heatmap import matplotlib.pyplot as plt months = df['month'].unique() for month in months: # 筛选当月数据,按天聚合销售值 month_df = df[df['month'] == month].groupby('sale_date')['sales'].sum().reset_index() # 生成当月完整日期序列 full_dates = pd.date_range(start=month.start_time, end=month.end_time, freq='D') # 合并数据,无销售日期填充0 full_month_df = pd.DataFrame({'date': full_dates}).merge(month_df, on='date', how='left').fillna(0) # 绘制热力图 plt.figure(figsize=(7, 3.5)) heatmap(full_month_df['date'], full_month_df['sales'], title=f'Sales Heatmap - {month.strftime("%Y-%m")}', cmap='YlGnBu', colorbar=True) plt.show()
替代方案:用calplot实现多月份子图布局
如果calplot默认的年视图不符合需求,可通过子图批量绘制各月份热力图:
import calplot import matplotlib.pyplot as plt # 按月份生成按天聚合的时间序列 month_series = [] for month in months: ts = df[df['month'] == month].set_index('sale_date')['sales'].resample('D').sum().fillna(0) month_series.append(ts) # 布局子图(示例:每行3个) n_cols = 3 n_rows = (len(months) + n_cols - 1) // n_cols fig, axes = plt.subplots(n_rows, n_cols, figsize=(16, 6*n_rows)) axes = axes.flatten() # 逐个绘制 for idx, (ts, month) in enumerate(zip(month_series, months)): calplot.calplot(ts, ax=axes[idx], cmap='YlOrRd', yearlabel_kws={'fontsize':11}) axes[idx].set_title(f'{month.strftime("%Y-%m")}', fontsize=13) # 隐藏未使用的子图 for j in range(idx+1, len(axes)): axes[j].axis('off') plt.tight_layout() plt.show()
错误排查要点
- July包报错:检查日期列是否无重复、无缺失,且为连续的
datetime类型; - calplot子图异常:确保每个月份的时间序列是按天聚合的单值数据;
- 销售值异常:若单日多条记录,必须先按日期求和,避免热力图值重复计算。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

