
本文详解如何在 pyplot 时间序列图中正确显示完整的日期和时间(如“01-03-24\n00:04:05”),解决因自动刻度选择导致时间信息丢失的问题,关键在于显式设置 set_xticks() 并配合 DateFormatter 与 autofmt_xdate()。
本文详解如何在 pyplot 时间序列图中正确显示完整的日期和时间(如“01-03-24\n00:04:05”),解决因自动刻度选择导致时间信息丢失的问题,关键在于显式设置 `set_xticks()` 并配合 `dateformatter` 与 `autofmt_xdate()`。
在使用 Matplotlib 绘制时间序列数据(如电力生成 vs. 时间)时,一个常见问题是:尽管已将字符串时间成功转换为 datetime 对象,并应用了 DateFormatter,x 轴仍只显示部分日期或完全忽略时间部分。根本原因在于——Matplotlib 默认会自动选择少数几个主刻度位置(ticks),而非覆盖所有数据点;而 DateFormatter 仅格式化这些被选中的刻度,未被选中的时间点即使存在也不会显示。
要确保每个数据点对应的时间(含日期+时间)都清晰呈现在 x 轴上,必须显式指定刻度位置。以下是完整、可靠的操作步骤:
Matplotlib Linux版 3.11.1 官方下载,来自 PyPI 官方发布,适合 Python 图表绘制、数据分析、科研可视化和 Jupyter Notebook 环境安装。
✅ 正确做法:三步到位
- 确保 date_time 是 datetime 类型列表(非字符串或 pd.Timestamp 未对齐时需转换);
- 用 ax.set_xticks(date_time) 强制将每个数据时间点设为刻度;
- 配置 DateFormatter 并启用自动旋转优化可读性。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
# 示例数据(请替换为你的真实数据)
data = [
("2024-03-01 00:04:05", 120.5),
("2024-03-01 22:20:30", 135.2),
("2024-03-02 03:56:23", 118.7),
("2024-03-03 22:33:51", 142.1),
("2024-03-04 14:46:24", 139.8),
("2024-03-04 20:48:52", 145.3),
("2024-03-05 01:31:23", 127.9),
("2024-03-07 23:21:16", 133.6)
]
# 安全转换:字符串 → datetime
date_time = [datetime.strptime(d, "%Y-%m-%d %H:%M:%S") for d, _ in data]
generation = [g for _, g in data]
# 创建图表
fig, ax = plt.subplots(figsize=(10, 6))
# 设置日期格式(换行显示日期与时间,提升紧凑性)
xfmt = mdates.DateFormatter('%d-%m-%y\n%H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
# ✅ 关键:显式设置每个数据点为刻度位置
ax.set_xticks(date_time)
# 绘图
ax.plot(date_time, generation, marker='o', linewidth=2, markersize=4)
# 自动旋转并微调标签间距(rotation=45 是推荐值,也可试 30 或 60)
fig.autofmt_xdate(rotation=45, ha='right')
# 增强可读性
ax.grid(True, linestyle='--', alpha=0.7)
ax.set_ylabel('Power Generation (kW)')
ax.set_title('Time Series: Power Generation vs. Timestamp')
plt.tight_layout() # 防止标签被截断
plt.show()⚠️ 注意事项
- 若数据点过多(如每分钟采样数天),不建议对全部点设 set_xticks(),否则标签严重重叠。此时应改用 mdates.HourLocator() 或 mdates.DayLocator() 配合智能间隔控制;
- autofmt_xdate() 必须在 set_xticks() 和 plot() 之后调用,且优先于 plt.show();
- 使用 pandas 时,若 date_time 是 pd.Series 或 DatetimeIndex,可直接传入 ax.set_xticks(),无需额外转换;
- 格式字符串说明:%d-%m-%y → 日-月-年(两位年份),%H:%M:%S → 24小时制时间;如需四位年份,用 %Y。
掌握这一组合(set_xticks + DateFormatter + autofmt_xdate),你就能精准掌控时间轴的每一个细节——让时间序列图真正“言之有物”。

















