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

如何让Matplotlib正确格式化datetime64对象并显示日期坐标轴?

Python水平条形图X轴日期显示异常修复方案

问题描述

尝试用matplotlib绘制水平条形图展示故障出现到修复的时间跨度,初始代码如下:

import matplotlib.pyplot as plt

plt.barh(subset['sources'], width=subset['repairDate'], left=subset['appearanceDate'])

但X轴日期显示为整数而非标准日期格式。后续尝试添加日期格式化器,代码如下:

fig, ax = plt.subplots(1, 1)

ax.barh(subset['sources'], width=subset['repairDate'], left=subset['appearanceDate'])
ax.xaxis.set_major_locator(mdates.YearLocator(1))
ax.xaxis.set_major_formatter(mdates.ConciseDateFormatter(ax.xaxis.get_major_locator()))
ax.set_xticklabels(ax.get_xticks(), rotation=90);

结果X轴刻度数量暴增,标签仍为整数,问题未解决。

核心原因

  1. 传入barh的left和width参数若为datetime对象,matplotlib会自动将其转换为自1970年以来的天数(整数形式),但不会将X轴识别为日期轴。
  2. 额外执行ax.set_xticklabels(ax.get_xticks())会覆盖日期格式化器的效果,强制显示整数。

修复步骤

1. 确保日期列是datetime类型

先将数据中的日期列转换为pandas datetime类型(若尚未转换):

import pandas as pd
subset['appearanceDate'] = pd.to_datetime(subset['appearanceDate'])
subset['repairDate'] = pd.to_datetime(subset['repairDate'])

2. 计算时间跨度数值

barh的width需要数值类型,因此计算故障出现到修复的天数(或其他时间单位):

subset['repair_duration'] = (subset['repairDate'] - subset['appearanceDate']).dt.days

3. 正确绘制并配置日期轴

将日期转换为matplotlib可识别的日期数值,再设置X轴的日期格式化规则,同时删除多余的set_xticklabels代码:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

fig, ax = plt.subplots(figsize=(10, 6))

# 将datetime转换为matplotlib日期数值
start_dates = mdates.date2num(subset['appearanceDate'])
# 绘制水平条形图
ax.barh(subset['sources'], width=subset['repair_duration'], left=start_dates)

# 配置X轴日期显示
ax.xaxis.set_major_locator(mdates.YearLocator(1))  # 按年显示刻度
ax.xaxis.set_major_formatter(mdates.ConciseDateFormatter(ax.xaxis.get_major_locator()))
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()

可选优化

如果希望X轴显示完整日期范围,可以手动设置X轴的上下限:

min_date = subset['appearanceDate'].min()
max_date = subset['repairDate'].max()
ax.set_xlim(mdates.date2num(min_date), mdates.date2num(max_date))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:47:21