使用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
相关产品推荐
相关产品推荐

