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

如何在Python的Matplotlib中自定义日期并按顺序绘制图表?

解决日期列排序问题:将浮点数日期转换为datetime类型

别慌,这个问题其实很典型——你之前的尝试都没触及核心:只有把这些「看起来像日期的字符串/浮点数」转换成真正的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中,我们一步步来处理:

  1. 将浮点数日期转换为字符串,拆分月份和年份
    先把float类型的Date列转成字符串,然后按.分割出月份和年份:

    import pandas as pd
    
    # 把float转成字符串
    df['Date_str'] = df['Date'].astype(str)
    # 拆分月份和年份到新列
    df[['month', 'year']] = df['Date_str'].str.split('.', expand=True)
    
  2. 组合月份和年份,转换为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'
    )
    
  3. 按时间排序(可选但推荐)
    提前对DataFrame按datetime列排序,确保绘图时数据是按时间顺序排列的:

    df = df.sort_values('datetime')
    
  4. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:37:42