如何将DataFrame月度小时数据按天拆分绘制子图?报错求助
解决方案
错误原因
你用np.array_split拆分后循环绘图报错,大概率是两种情况:
- 循环时误操作了numpy数组本身,而非数组内的单个DataFrame;
- 拆分逻辑不对,导致部分拆分块不是完整的单日数据,后续调用
plot时出现异常。
推荐实现方案:按日期分组绘图(更可靠)
直接按日期对DataFrame分组,确保每个子图对应完整的单日数据,步骤如下:
- 导入依赖库
import pandas as pd import matplotlib.pyplot as plt import math
- 按日期分组数据
假设你的DataFrame索引dateTimeUtc是datetime类型,先提取日期作为分组键:
# 新增日期列用于分组 df['date'] = df.index.date # 按日期分组,得到每个日期对应的子DataFrame列表 daily_groups = list(df.groupby('date'))
- 创建子图网格
根据天数动态计算子图的行/列数(以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()
- 循环绘制每个子图
遍历分组数据,在对应子图上绘制,并处理多余子图:
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
相关产品推荐
相关产品推荐

