如何在Python的Matplotlib中自定义日期并按顺序绘制图表?
别慌,这个问题其实很典型——你之前的尝试都没触及核心:只有把这些「看起来像日期的字符串/浮点数」转换成真正的datetime对象,程序才能理解它们的时间先后关系,绘图时自然就能正确排序X轴了。
为什么之前的方法没用?
不管你是保留浮点数、转成普通字符串,还是映射成jan-2019这种格式,这些数据本质上还是数值或字符串类型:
- 浮点数排序会按数值大小,比如
11.2018(数值11.2018)会比1.2019(1.2019)大,但实际时间上2018年11月早于2019年1月,完全反了; - 字符串排序是按字典序,比如
1.2019会排在11.2018前面(因为第二个字符.的ASCII码比1小),同样不符合时间逻辑。
只有datetime类型是专门为时间设计的,它自带时间顺序属性,绘图工具(matplotlib、seaborn等)会自动识别并按时间排序。
具体解决步骤(用Pandas为例)
假设你的数据集存在DataFramedf中,我们一步步来处理:
将浮点数日期转换为字符串,拆分月份和年份
先把float类型的Date列转成字符串,然后按.分割出月份和年份:import pandas as pd # 把float转成字符串 df['Date_str'] = df['Date'].astype(str) # 拆分月份和年份到新列 df[['month', 'year']] = df['Date_str'].str.split('.', expand=True)组合月份和年份,转换为datetime类型
用pd.to_datetime把年份和月份组合成标准的datetime对象(默认会把日期设为当月1号,不影响排序):df['datetime'] = pd.to_datetime(df['year'] + '-' + df['month'], format='%Y-%m')如果你想更简洁,也可以用正则表达式直接替换格式,省去拆分步骤:
# 把"1.2019"替换成"2019-1",再转datetime df['datetime'] = pd.to_datetime( df['Date'].astype(str).str.replace(r'(\d+)\.(\d+)', r'\2-\1', regex=True), format='%Y-%m' )按时间排序(可选但推荐)
提前对DataFrame按datetime列排序,确保绘图时数据是按时间顺序排列的:df = df.sort_values('datetime')用datetime列绘图
绘图时直接使用新的datetime列作为X轴,工具会自动按时间顺序排列:import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) plt.plot(df['datetime'], df['Another column']) # 替换成你的数值列 plt.xlabel('Date') plt.ylabel('Value') plt.title('Time Series Plot') plt.xticks(rotation=45) # 旋转X轴标签,避免重叠 plt.show()
效果验证
完成转换后,你可以查看df['datetime'].dtype,会显示datetime64[ns]——这就是我们要的类型。此时绘图的X轴会严格按照2018年11月 → 2019年1月 → 2019年2月 → 2021年6月 → 2021年8月的顺序排列,完全符合时间逻辑。
内容的提问来源于stack exchange,提问作者Silvio sjsj

