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

如何为时间序列DataFrame按天绘制3列布局的多子图?

解决方案

前置准备

先确保DataFrame的索引为datetime类型,若未转换先执行:

import pandas as pd
import matplotlib.pyplot as plt

# 转换索引为datetime类型
df.index = pd.to_datetime(df.index)

1. 一次性绘制所有日期的子图

利用Pandas原生的groupby按天分组特性,结合Matplotlib生成固定3列、行数自动适配的子图布局:

# 按天对数据分组
daily_data = df.groupby(df.index.date)
total_days = len(daily_data)
cols = 3
# 自动计算行数,向上取整适配总天数
rows = (total_days + cols - 1) // cols

# 创建画布和子图数组
fig, axes = plt.subplots(nrows=rows, ncols=cols, figsize=(15, 4*rows), tight_layout=True)
# 拍平子图数组,方便批量遍历
axes = axes.flatten()

# 遍历分组绘制对应子图
for ax, (date, data) in zip(axes, daily_data):
    data.plot(y='Temp', ax=ax, title=str(date), legend=False)
    # 可选优化:x轴仅显示时间,去掉重复的日期信息
    ax.xaxis.set_major_formatter(plt.matplotlib.dates.DateFormatter('%H:%M'))

# 隐藏总天数不是3的倍数时多出的空子图
for i in range(total_days, len(axes)):
    axes[i].axis('off')

plt.show()

2. 绘制指定N天范围的子图

只需先按时间范围筛选原DataFrame,后续绘图逻辑和上述完全一致即可:

# 示例:筛选2019年1月1日到2019年1月10日共10天的数据
start_date = '2019-01-01'
end_date = '2019-01-10'
filtered_df = df.loc[start_date:end_date]

# 后续对filtered_df执行和上文完全相同的分组、绘图逻辑即可
daily_data = filtered_df.groupby(filtered_df.index.date)
# 剩余代码和上文完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:15:00