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

如何将DataFrame月度小时数据按天拆分绘制子图?报错求助

解决方案

错误原因

你用np.array_split拆分后循环绘图报错,大概率是两种情况:

  1. 循环时误操作了numpy数组本身,而非数组内的单个DataFrame;
  2. 拆分逻辑不对,导致部分拆分块不是完整的单日数据,后续调用plot时出现异常。

推荐实现方案:按日期分组绘图(更可靠)

直接按日期对DataFrame分组,确保每个子图对应完整的单日数据,步骤如下:

  1. 导入依赖库
import pandas as pd
import matplotlib.pyplot as plt
import math
  1. 按日期分组数据
    假设你的DataFrame索引dateTimeUtc是datetime类型,先提取日期作为分组键:
# 新增日期列用于分组
df['date'] = df.index.date
# 按日期分组,得到每个日期对应的子DataFrame列表
daily_groups = list(df.groupby('date'))
  1. 创建子图网格
    根据天数动态计算子图的行/列数(以30天为例,用6行5列网格):
n_days = len(daily_groups)
cols = 5  # 每行列数
rows = math.ceil(n_days / cols)  # 计算需要的行数

# 创建子图网格
fig, axes = plt.subplots(rows, cols, figsize=(15, 12))
# 将二维子图数组转为一维,方便循环遍历
axes = axes.flatten()
  1. 循环绘制每个子图
    遍历分组数据,在对应子图上绘制,并处理多余子图:
for i, (date, daily_df) in enumerate(daily_groups):
    ax = axes[i]
    # 绘制当日的Hourly_diff数据
    daily_df['Hourly_diff'].plot(ax=ax, linewidth=1)
    # 设置子图标题和标签
    ax.set_title(str(date), fontsize=10)
    ax.set_xlabel('UTC Time', fontsize=8)
    ax.set_ylabel('Hourly_diff', fontsize=8)
    # 简化x轴刻度显示
    ax.tick_params(axis='both', labelsize=7)

# 隐藏未使用的多余子图
for j in range(i + 1, len(axes)):
    axes[j].axis('off')

# 自动调整子图间距
plt.tight_layout()
plt.show()

备选方案:修复np.array_split的用法

如果坚持用拆分方式,需确保循环时正确访问数组内的每个DataFrame,同时注意拆分后的块是否对应单日数据(仅当数据是严格的整月每日24小时时适用):

split_dfs = np.array_split(df, 30)  # 拆分为30块
fig, axes = plt.subplots(6, 5, figsize=(15, 12))
axes = axes.flatten()

for i, daily_df in enumerate(split_dfs):
    if not daily_df.empty:
        daily_df['Hourly_diff'].plot(ax=axes[i])
        axes[i].set_title(f'Day {i+1}')
        axes[i].tick_params(labelsize=7)

plt.tight_layout()
plt.show()

注意:这种方式仅在数据是严格的每日24小时、整月无缺失时可靠,否则会出现跨天的拆分块,不如按日期分组准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:27:25