使用PyPlot绘制Pandas DataFrame时日期偏移一天的问题求助
解决Matplotlib 2.1.1中Pandas Timestamp绘图日期偏移一天的问题
嘿,这个问题我之前在老版本Matplotlib里也踩过坑!尤其是你用的2.1.1版本,确实存在Pandas Timestamp和Matplotlib日期解析不兼容的情况,导致月末的日期会被偏移一天。下面给你几个可行的解决办法:
1. 把Timestamp转成Python原生datetime对象
Matplotlib对原生datetime的支持更稳定,你可以先把DataFrame的索引转换一下:
# 转换索引为python datetime类型 data.index = data.index.to_pydatetime() # 再正常绘图并设置格式 fig, ax = plt.subplots() ax.plot(data.index, data['test']) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) plt.xticks(rotation=45) plt.show()
2. 先用Pandas绘图再自定义坐标轴
Pandas自己的绘图接口会自动处理Timestamp的日期转换,避免偏移问题,之后你再用Matplotlib来调整格式就行:
# 先用Pandas绘制基础图 ax = data['test'].plot() # 自定义日期格式和显示样式 ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) plt.xticks(rotation=45) plt.tight_layout() # 防止日期标签被截断 plt.show()
3. 强制设置月度刻度锚点
如果一定要用纯Matplotlib绘图,可以直接指定刻度锚定到每月最后一天,刚好匹配你的数据日期:
fig, ax = plt.subplots() ax.plot(data.index, data['test']) # 设置主刻度为每月最后一天,间隔1个月 ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1, bymonthday=-1)) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) plt.xticks(rotation=45) plt.tight_layout() plt.show()
额外建议:升级Matplotlib
这个日期偏移的bug在Matplotlib 3.0及以上版本已经被修复了,如果项目允许的话,升级一下版本能彻底解决这类问题:
pip install --upgrade matplotlib
内容的提问来源于stack exchange,提问作者ivan7707
相关产品推荐
相关产品推荐

