如何在绘图X轴显示日期?Pandas绘图尝试后遇问题
解决日期索引绘图的问题
咱们一步步来解决你遇到的两个问题:
第一个问题:设置索引后X轴还是显示0-17的浮点数
你用df.set_index('Week')之后直接调用df.plot(),其实这里有个小坑——pandas的set_index默认不会修改原DataFrame,它会返回一个新的、已经改好索引的DataFrame,但你没把这个结果存回df里,所以后面绘图用的还是原来的默认整数索引(0到17)。
解决起来很简单,二选一就行:
- 把修改后的结果重新赋值给df:
df = df.set_index('Week') df.plot() plt.show()
- 用
inplace=True直接修改原DataFrame:
df.set_index('Week', inplace=True) df.plot() plt.show()
第二个问题:转datetime后绘图报错ValueError: ordinal must be >= 1
这个错误一般是因为日期转换出问题了——要么是转换后的列里有无效的日期值(比如NaT),要么是matplotlib没正确识别你的datetime索引。咱们按步骤排查:
第一步:确保日期转换完全成功
先把Week列转成datetime类型,同时检查有没有转失败的情况:
# 转换时用errors='coerce',把识别不了的日期转成NaT,方便我们检查 df['Week'] = pd.to_datetime(df['Week'], errors='coerce') # 看看有多少转失败的日期 print(df['Week'].isna().sum())
如果输出是0,说明所有日期都转成功了;如果大于0,那你得先清理Week列里的无效日期格式。
第二步:设置索引并正常绘图
转换没问题的话,设置索引再绘图,还可以给x轴日期加个旋转,避免标签挤在一起:
# 设置datetime为索引 df = df.set_index('Week') # 绘图 ax = df.plot() # 旋转x轴日期标签,让它更易读 plt.xticks(rotation=45) plt.tight_layout() # 防止日期标签被截断 plt.show()
备选方案:不用改索引,直接指定x轴
如果你不想动索引,也可以在绘图的时候直接指定x轴为Week列,这样更直观:
# 先转成datetime df['Week'] = pd.to_datetime(df['Week']) # 绘图时指定x参数 df.plot(x='Week') plt.xticks(rotation=45) plt.tight_layout() plt.show()
这样应该就能顺利画出以日期为X轴、三列数据为Y轴的图啦!
内容的提问来源于stack exchange,提问作者Lorran Rosa
相关产品推荐
相关产品推荐

