我正在使用包含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()
答案 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()