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

使用Matplotlib绘制多热力图时遇ValueError: arrange无法计算长度问题

解决时间序列每月热力图的ValueError问题

问题根源

报错ValueError: arrange: cannot compute length是因为按月份分组时,部分分组的day列可能为空,或者day.max()返回NaN(无数据时),导致np.arange无法生成有效序列。硬编码天数无效是因为不同月份天数差异大,且无法适配数据缺失的情况。

具体解决步骤

1. 提前清理无效数据

先确保day列是有效数值,同时删除缺失关键字段的行:

import pandas as pd

# 转换day列为数值,无效值转为空
df['day'] = pd.to_numeric(df['day'], errors='coerce')
# 删除day、month、value任意为空的行
df = df.dropna(subset=['day', 'month', 'value'])

2. 跳过无数据的月份分组

遍历分组时直接跳过空数据的月份,避免后续计算出错:

for month, data in df.groupby('month'):
    if data.empty:
        continue
    # 后续绘图逻辑

3. 基于实际日期范围生成网格

不再依赖day.max(),改用分组内的最小/最大日期生成连续序列,适配不同月份的天数:

import numpy as np

min_day = data['day'].min()
max_day = data['day'].max()
# 生成从当月最小日期到最大日期的连续序列
xgrid = np.arange(min_day, max_day + 1)

完整修改示例代码

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 加载并清理数据集
df = pd.read_csv('你的数据集路径.csv')
df['day'] = pd.to_numeric(df['day'], errors='coerce')
df = df.dropna(subset=['day', 'month', 'value'])

# 创建子图布局(2行3列适配5-10月共6个月)
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
axes = axes.flatten()

# 按月份分组绘制热力图
for idx, (month, data) in enumerate(df.groupby('month')):
    if data.empty:
        axes[idx].set_visible(False)
        continue
    
    # 生成日期和小时网格
    min_day, max_day = data['day'].min(), data['day'].max()
    min_hour, max_hour = data['hour'].min(), data['hour'].max()
    xgrid = np.arange(min_day, max_day + 1)
    ygrid = np.arange(min_hour, max_hour + 1)
    
    # 构建热力图数据透视表
    pivot_data = data.pivot_table(index='hour', columns='day', values='value', fill_value=0)
    # 绘制热力图
    sns.heatmap(pivot_data, ax=axes[idx], xticklabels=xgrid, yticklabels=ygrid, cmap='viridis')
    axes[idx].set_title(f'2021年{month}月')

plt.tight_layout()
plt.show()

内容的提问来源于stack exchange,提问作者Dizzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:05:20