使用matplotlib绘制时间序列pandas数据帧时标签错误

时间:2017-08-31 07:37:52

标签: python pandas matplotlib

我正在使用包含1周数据的数据框。

                          y
ds                             
2017-08-31 10:15:00    1.000000
2017-08-31 10:20:00    1.049107
2017-08-31 10:25:00    1.098214
...
2017-09-07 10:05:00   99.901786
2017-09-07 10:10:00   99.950893
2017-09-07 10:15:00  100.000000

我通过结合工作日和时间创建一个新索引,即

                y
dayIndex             
4 - 10:15    1.000000
4 - 10:20    1.049107
4 - 10:25    1.098214
...
4 - 10:05   99.901786
4 - 10:10   99.950893
4 - 10:15  100.000000

此数据的图表如下: Weekly data 该图是正确的,因为标签反映了数据框中的数据。但是,放大时,标签似乎不正确,因为它们不再与原始值相对应: Wrong labels when zooming 是什么导致了这种行为?

以下是重现此内容的代码:

import datetime
import numpy as np
import pandas as pd

dtnow = datetime.datetime.now()
dindex = pd.date_range(dtnow , dtnow  + datetime.timedelta(7), freq='5T')
data = np.linspace(1,100, num=len(dindex))
df = pd.DataFrame({'ds': dindex, 'y': data})
df = df.set_index('ds')
df = df.resample('5T').mean()
df['dayIndex'] = df.index.strftime('%w - %H:%M')
df= df.set_index('dayIndex')
df.plot()

1 个答案:

答案 0 :(得分:1)

  

“导致此行为的原因是什么?”

大熊猫日期图的轴格式化为matplotlib.ticker.FixedFormatter(参见例如 print plt.gca().xaxis.get_major_formatter())。 “固定”表示它使用一些常量字符串格式化i刻度(如果显示)   在切换或平移时,您可以移动刻度线位置,而不是格式字符串 简而言之:大熊猫的日期图可能不是交互式地块的最佳选择。

<强>解决方案

解决方案通常是直接使用matplotlib格式化程序。这要求日期为datetime个对象(可以使用df.index.to_pydatetime()确保)。

import datetime
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates

dtnow = datetime.datetime.now()
dindex = pd.date_range(dtnow , dtnow  + datetime.timedelta(7), freq='110T')
data = np.linspace(1,100, num=len(dindex))
df = pd.DataFrame({'ds': dindex, 'y': data})
df = df.set_index('ds')
df.index.to_pydatetime()
df.plot(marker="o")


plt.gca().xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%w - %H:%M'))
plt.show()

enter image description here