使用Matplotlib以datetime类型绘制非连续时间序列遇异常问题
问题描述
我尝试使用以下数据集绘制date与num的关系图:
date num 0 22/12/2022 09:09 7.92 1 22/12/2022 09:09 7.95 2 22/12/2022 09:09 7.98 3 22/12/2022 09:09 7.95 4 22/12/2022 09:09 7.93 ... ... ... 4514 23/12/2022 14:48 5.68 4515 23/12/2022 14:48 5.68 4516 23/12/2022 14:48 5.69 4517 23/12/2022 14:48 5.70 4518 23/12/2022 14:48 5.66
当date列类型为字符串时,绘制的图是正确的:
data_1.plot(x='date',y='num') plt.xticks(rotation = 45)
(配图:字符串日期绘图效果)
但当我将date转换为datetime类型后,图中出现了数据中不存在的时间点:
data_1['date'] = pd.to_datetime(data_1['date'], format='%d/%m/%Y %H:%M') data_1.plot(x='date',y='num') plt.xticks(rotation = 45)
(配图:datetime类型绘图效果)
更新:感谢编辑我的问题并提供解决方案,但该方案建议转回字符串类型,我需要基于datetime类型的解决办法。
解决方案
原因分析
使用pandas的plot()方法绘制datetime类型的x轴时,pandas会自动生成连续的时间轴刻度——哪怕你的数据是离散的时间点(比如多个数据点共享同一时间),它会默认填充时间区间内的所有刻度,导致出现数据中不存在的时间点。
解决办法
方法1:用matplotlib直接绘图,指定x轴刻度为数据中唯一的datetime值
import matplotlib.pyplot as plt import pandas as pd # 转换date为datetime类型 data_1['date'] = pd.to_datetime(data_1['date'], format='%d/%m/%Y %H:%M') # 获取数据中唯一的时间点 unique_dates = data_1['date'].unique() # 使用matplotlib原生绘图 plt.plot(data_1['date'], data_1['num']) plt.xticks(ticks=unique_dates, labels=unique_dates, rotation=45) plt.show()
方法2:pandas绘图时启用x_compat=True参数
pandas的plot()方法提供x_compat=True参数,会调用matplotlib的原生日期处理逻辑,避免自动生成额外的时间刻度:
data_1['date'] = pd.to_datetime(data_1['date'], format='%d/%m/%Y %H:%M') data_1.plot(x='date', y='num', x_compat=True) plt.xticks(rotation=45) plt.show()
方法3:手动设置x轴刻度定位器
通过matplotlib的日期定位器,强制只显示数据中存在的时间点:
import matplotlib.dates as mdates data_1['date'] = pd.to_datetime(data_1['date'], format='%d/%m/%Y %H:%M') ax = data_1.plot(x='date', y='num') # 设置刻度为数据中的唯一日期 ax.xaxis.set_major_locator(mdates.FixedLocator(data_1['date'].unique())) plt.xticks(rotation=45) plt.show()
内容的提问来源于stack exchange,提问作者Muhammad M
相关产品推荐
相关产品推荐

