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

Pandas绘图用ConciseDateFormatter后X轴日期异常及格式优化求助

问题解答

1. 错误日期显示的原因及修复方案

原因分析

出现1971年10月的错误日期,核心问题是你的日期数据未被正确解析为Matplotlib可识别的datetime类型:

  • pandas的df.plot()内部会自动处理字符串/Excel日期序列号,所以能显示正确刻度;
  • 但手动设置AutoDateLocator和ConciseDateFormatter时,Matplotlib会把非datetime类型的索引(比如整数位置、未转换的字符串)直接当作「1970-01-01以来的天数」计算,最终得到错误的早期日期。

修复步骤

步骤1:确保日期列被解析为DatetimeIndex

导入Excel时直接指定解析日期列:

import pandas as pd
# parse_dates指定日期列,index_col设为日期索引
df = pd.read_excel("your_data.xlsx", parse_dates=["date_column"], index_col="date_column")

如果已经导入数据,事后转换:

df["date_column"] = pd.to_datetime(df["date_column"])
df.set_index("date_column", inplace=True)

验证索引类型:执行print(df.index.dtype),输出应为datetime64[ns]。

步骤2:正确设置定位器和格式化器

基于正确的DatetimeIndex,再配置Matplotlib的日期组件:

import matplotlib.pyplot as plt
from matplotlib.dates import AutoDateLocator, ConciseDateFormatter

ax = df.plot()
# 设置自动日期定位器,控制刻度数量
locator = AutoDateLocator(minticks=3, maxticks=7)
formatter = ConciseDateFormatter(locator)
# 绑定到X轴
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)

plt.tight_layout()
plt.show()

2. 自定义X轴刻度为月份名称+必要年份

方案1:利用ConciseDateFormatter自动适配

ConciseDateFormatter本身会根据时间范围自动调整显示逻辑:

  • 时间范围在1年内:仅显示月份名称(如Jan、Feb);
  • 跨年度:在年初刻度显示「月份+年份」(如Jan 2022),其余仅显示月份。

如果需要微调格式,可修改其内置参数:

formatter = ConciseDateFormatter(locator)
# 自定义不同时间粒度的显示格式
formatter.formats = ['%Y', '%b %Y', '%b', '%d %b', '%H:%M', '%H:%M']
# 零刻度(起始点)的格式
formatter.zero_formats = ['', '%Y', '%b %Y', '%b %d', '%b %d', '%H:%M']
# 底部偏移文本的格式
formatter.offset_formats = ['', '%Y', '%Y-%b', '%Y-%b-%d', '%Y-%b-%d', '%Y-%b-%d %H:%M']

方案2:完全自定义格式

如果需要更个性化的显示(比如仅在每年第一个月显示年份),使用FuncFormatter:

import matplotlib.dates as mdates
import matplotlib.ticker as mticker

def custom_formatter(x, pos):
    # 将刻度数值转换为datetime对象
    dt = mdates.num2date(x)
    # 每年1月显示「月份+年份」,其余仅显示月份缩写
    if dt.month == 1:
        return dt.strftime('%b %Y')
    else:
        return dt.strftime('%b')

ax = df.plot()
ax.xaxis.set_major_locator(AutoDateLocator(minticks=3, maxticks=7))
ax.xaxis.set_major_formatter(mticker.FuncFormatter(custom_formatter))

plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:42:41