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

字符串索引转为datetime类型后绘图出现交叉线的原因及解决方法

字符串索引转为datetime类型后绘图出现交叉线的原因及解决方法

嘿,我来帮你把这个问题掰扯清楚!

为什么会出现两种完全不同的图?

咱们先拆解两个场景的本质:

  • 场景1(字符串索引):matplotlib根本不“懂”你这些字符串是时间,它只是把每个字符串标签按你输入的顺序依次排到x轴上,然后顺着列表里的顺序把数据点连起来。所以你看到的是一条“顺溜”的折线,但这其实是假的有序——你的时间数据本身是乱序的(比如第一个数据是2002-12-31,第二个却是更早的2002-06-06),只是因为matplotlib没识别时间,才按输入顺序画了出来。
  • 场景2(datetime索引):这时候pandas和matplotlib真正识别了时间的先后逻辑,x轴会自动按时间从早到晚排列。但你的数据点本身是乱序的,绘图时就会把早的时间点和晚的时间点来回连线,于是就出现了那些交叉的线条——这不是绘图的问题,而是它帮你暴露了你的数据集本身是时间乱序的问题!

你看到视频里没问题,大概率是人家的数据集本身已经按时间排好序了,所以转datetime后直接画就正常~

怎么解决?

核心就是把你的DataFrame按datetime索引排序,让数据点按时间从早到晚排列,之后再绘图就会得到正确的时间序列折线图了。

修改后的代码如下:

import matplotlib.pyplot as plt
import pandas as pd

sample_df = pd.DataFrame()
sample_df["Date"] = [ "2002-12-31 01:00:00", "2002-06-06 10:00:00", "2003-11-10 19:00:00",  
                      "2003-04-15 04:00:00", "2004-09-19 14:00:00", "2004-02-24 23:00:00",  
                      "2005-07-30 08:00:00", "2005-01-03 17:00:00", "2006-06-08 02:00:00",  
                      "2007-11-12 11:00:00", "2007-04-18 20:00:00", "2008-09-21 06:00:00",  
                      "2008-02-26 15:00:00", "2009-08-03 00:00:00", "2009-01-05 09:00:00",  
                      "2010-06-11 19:00:00", "2011-11-14 04:00:00", "2011-04-20 13:00:00",  
                      "2012-09-24 23:00:00", "2012-02-28 08:00:00", "2013-08-04 17:00:00",  
                      "2013-01-07 02:00:00", "2014-06-13 09:00:00", "2015-11-17 18:00:00",
                      "2015-04-22 01:00:00", "2016-09-26 09:00:00", "2016-03-02 18:00:00",
                      "2017-08-06 01:00:00", "2017-01-10 10:00:00", "2018-01-16 19:00:00" ]
sample_df["Energy_MW"] = [ 26498.0, 39167.0, 36614.0, 21837.0, 26644.0,
                           33574.0, 30255.0, 33781.0, 24344.0, 34708.0,
                           33996.0, 21127.0, 36255.0, 31982.0, 35448.0,
                           37066.0, 22116.0, 31326.0, 26569.0, 33565.0,
                           34649.0, 25709.0, 33516.0, 33032.0, 22333.0,
                           28064.0, 33905.0, 25304.0, 41505.0, 39543.0 ]
sample_df = sample_df.set_index("Date")
# 转成datetime索引
sample_df.index = pd.to_datetime(sample_df.index)
# 关键一步:按时间索引排序
sample_df = sample_df.sort_index()

# 绘图
fig = plt.figure( figsize = (10,5) )
plt.plot(sample_df.index, sample_df["Energy_MW"], 'b')
plt.grid(True)
plt.show()

最终效果

排序后绘图,你会得到一张真正符合时间逻辑的折线图:x轴按时间从早到晚排列,线条连贯没有交叉,能准确反映Energy_MW随时间的变化趋势,这才是时间序列图该有的样子~

备注:内容来源于stack exchange,提问作者Lyudmil Yovkov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:48:04