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

使用Pandas绘制时间序列柱状图年份显示异常的技术求助

解决Pandas柱状图mdates格式化轴显示1970年的问题

问题根源

Pandas绘制柱状图时,默认会将datetime类型的x轴转换为整数索引(从0开始的序列),而非保留原生datetime对象。matplotlib的mdates模块只能识别datetime类型的轴数据,直接套用的话,会把这些整数当成1970-01-01以来的天数,导致年份显示错误。

解决方案步骤

1. 确保日期列是datetime类型

先检查并转换日期列类型,避免后续类型错误:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 转换日期列为datetime类型
df['date'] = pd.to_datetime(df['date'])

2. Pandas绘图后映射回datetime轴

绘制柱状图后,将x轴的整数刻度映射回原DataFrame的datetime值,再用mdates格式化:

# 绘制柱状图
ax = df.plot(kind='bar', x='date', y='value', figsize=(12, 6))

# 把x轴刻度位置映射回原日期数据
ticks = ax.get_xticks()
tick_dates = df['date'].iloc[ticks]

# 设置mdates的定位器和格式化器,适配25年跨度
ax.xaxis.set_major_locator(mdates.YearLocator(2))  # 每2年显示一个刻度
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))  # 仅显示年份

# 旋转刻度标签避免重叠
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

3. 重采样简化图表(适合大跨度数据)

25年的高频数据(如月度)会导致柱子过密,不符合出版要求,可先按年/季度重采样聚合:

# 按年重采样,计算年度均值(可替换为sum、max等聚合方式)
df_yearly = df.resample('Y', on='date')['value'].mean().reset_index()

# 绘制年度柱状图
ax = df_yearly.plot(kind='bar', x='date', y='value', figsize=(10, 5))

# 映射并格式化x轴
ticks = ax.get_xticks()
tick_dates = df_yearly['date'].iloc[ticks]

ax.xaxis.set_major_locator(mdates.YearLocator(1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))

plt.xticks(rotation=0)
plt.tight_layout()
plt.show()

关键注意点

  • Pandas的bar图默认使用整数索引作为x轴,这是和折线图的核心区别,必须手动映射回datetime值
  • mdates.YearLocator()的参数可根据数据跨度调整(比如跨度25年用YearLocator(2)或YearLocator(3)),自动适配刻度密度
  • 重采样时要选择合适的聚合方式,保证数据展示的准确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:05:05