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

为何Matplotlib绘图时会自动添加日期?示例:2023-02-15

为什么Matplotlib绘图会自动显示带日的日期(如2023-02-15)?

原因分析

你用pd.to_datetime处理YearMonth列时,只指定了%Y%m的格式,Pandas会自动把日部分默认设为当月第一天(比如202302会转为2023-02-01),最终得到的是完整的datetime64类型数据。而Matplotlib的日期刻度渲染逻辑会根据数据的时间跨度自动选择刻度显示格式,当它认为需要填充刻度间隔时,就会生成中间日期(比如2023-02-15)作为刻度标签,这就出现了你看到的带日的日期。

解决办法

这里提供三种实用的处理方式:

  • 自定义Matplotlib日期刻度格式
    直接指定x轴刻度只显示年月,代码如下:

    import pandas as pd
    import matplotlib.pyplot as plt
    from matplotlib.dates import DateFormatter
    
    df = pd.DataFrame()
    df['YearMonth'] = [202303,202302,202301,202212,202211]
    df['total_burgers'] = [800,900,1200,1100,1000]
    df['YearMonth'] = pd.to_datetime(df['YearMonth'], format='%Y%m')
    
    fig, ax = plt.subplots()
    ax.plot(df['YearMonth'], df['total_burgers'])
    
    # 设置日期格式为「年-月」
    date_formatter = DateFormatter("%Y-%m")
    ax.xaxis.set_major_formatter(date_formatter)
    
    # 旋转刻度标签避免重叠
    plt.xticks(rotation=45)
    plt.show()
    
  • 将日期转为字符串作为x轴
    如果不需要后续对日期做计算,直接把YearMonth转成年月字符串,这样Matplotlib就会按普通文本渲染刻度:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame()
    df['YearMonth'] = [202303,202302,202301,202212,202211]
    df['total_burgers'] = [800,900,1200,1100,1000]
    # 转为「年-月」格式的字符串
    df['YearMonth'] = df['YearMonth'].astype(str).apply(lambda x: f"{x[:4]}-{x[4:]}")
    
    plt.plot(df['YearMonth'], df['total_burgers'])
    plt.xticks(rotation=45)
    plt.show()
    
  • 使用Pandas内置绘图接口
    Pandas的绘图工具对日期类型的处理更贴合日常需求,会自动优化刻度显示:

    import pandas as pd
    
    df = pd.DataFrame()
    df['YearMonth'] = [202303,202302,202301,202212,202211]
    df['total_burgers'] = [800,900,1200,1100,1000]
    df['YearMonth'] = pd.to_datetime(df['YearMonth'], format='%Y%m')
    
    df.plot(x='YearMonth', y='total_burgers', rot=45)
    plt.show()
    

内容的提问来源于stack exchange,提问作者Puzzlemaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:43:14