Python 使用matplotlib打印时间序列数据帧时标签错误
我正在使用一个包含1周数据的数据框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-
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()