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

使用axvline结合DatetimeIndex绘制竖线异常问题求助

用Matplotlib的axvline绘制日期竖线时显示在1970-01-01的问题解决

我尝试用axvline函数绘制竖线,直接传入日期字符串,但竖线总是显示在1970-01-01。我的DataFrame信息如下:

CPISXS    CPIX    WTI  UMCSI
Dates               
2022-08-31  387.748 263.732  93.67   44.0
2022-09-30  390.555 264.370  84.26   42.0
2022-10-31  390.582 264.442  87.55   42.0
2022-11-30  390.523 263.771  84.37   46.0
2022-12-31      NaN     NaN    NaN    NaN

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 756 entries, 1960-01-31 to 2022-12-31
Freq: M
Data columns (total 4 columns):
     #   Column  Non-Null Count  Dtype  
    ---  ------  --------------  -----  
     0   CPISXS  480 non-null    float64
     1   CPIX    671 non-null    float64
     2   WTI     755 non-null    float64
     3   UMCSI   670 non-null    float64
    dtypes: float64(4)
    memory usage: 45.7 KB

我的代码如下:

fig2, m1 = plt.subplots(figsize=(12,6))
m2=m1.twinx()
m1.axvline(x='1990-01-30')
m1.plot(df0['UMCSI'],'r--',linewidth=1)
m2.plot(df0['WTI'],'b')

问题原因与解决方法

问题出在先调用axvline,后绘制折线图。Matplotlib在你先传入日期字符串时,还未识别到x轴是Datetime类型,会把字符串默认转成时间戳起始点(1970-01-01)。

方法1:调整代码顺序(无需额外转换)

先绘制折线图,让Matplotlib自动识别x轴为日期类型,再调用axvline传入日期字符串即可:

fig2, m1 = plt.subplots(figsize=(12,6))
m2=m1.twinx()
# 先绘制折线图,让x轴被识别为日期类型
m1.plot(df0['UMCSI'],'r--',linewidth=1)
m2.plot(df0['WTI'],'b')
# 再绘制竖线,此时直接传日期字符串正常生效
m1.axvline(x='1990-01-30')

方法2:直接传入Timestamp对象(不受代码顺序影响)

把日期字符串转成pandas.Timestamp对象传入,不管代码顺序如何都能准确定位:

import pandas as pd

fig2, m1 = plt.subplots(figsize=(12,6))
m2=m1.twinx()
m1.axvline(x=pd.Timestamp('1990-01-30'))
m1.plot(df0['UMCSI'],'r--',linewidth=1)
m2.plot(df0['WTI'],'b')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:35:21