字符串索引转为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
相关产品推荐
相关产品推荐

