Python 使用matplotlib打印时间序列数据帧时标签错误

Python 使用matplotlib打印时间序列数据帧时标签错误,python,pandas,matplotlib,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-

我正在使用一个包含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
该数据的曲线图如下所示: 该图是正确的,因为标签反映了数据框中的数据。但是,放大时,标签似乎不正确,因为它们不再与其原始值对应: 是什么导致了这种行为

下面是复制此代码的代码:

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()
“是什么导致了这种行为?”

绘图轴的格式化程序是一个
matplotlib.ticker.FixedFormatter
(参见例如。
打印plt.gca().xaxis.get\u major\u formatter()
)。“Fixed”是指它用一些常量字符串格式化
i
th勾号(如果显示)

缩放或平移时,可以移动记号位置,但不能移动格式字符串。
简而言之:熊猫日期图可能不是互动图的最佳选择

解决方案

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


格式字符串为什么不随刻度移动?你知道这是故意的,还是应该作为问题报告?我指的是我的原始代码。您发布的一个非常有用。
FixedFormatter
修复标签,使其绑定到标签的索引,这是设计的结果(因此得名)。熊猫datetime绘图是否使用固定格式将被视为一个问题,这可能是一个品味问题。它有几个优点,但是您遇到了一个不需要它的情况。因此,我不会将其称为bug,但如果您愿意,可以将其作为特性请求报告。
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()