我正在尝试使用Pandas和matplotlib绘制时间序列图,并在x轴上标记了工作日(星期一)。但是,我遇到了一个奇怪的行为,我相信是由于pandas.Series.plot
函数中对日期时间索引的处理(错误?)引起的。
摘自pandas.Series.plot
的文档(也在pandas.DataFrame.plot
中):
use_index
布尔,默认为True
。
使用索引作为x轴的刻度。但是,尽管索引是DatetimeIndex
类型的,但看起来却不被认为是索引(可能以字符串形式处理?)。
考虑以下代码,尝试使用三种不同的方法创建相同的图:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
idx = pd.date_range(start='2020-10-02', periods=35)
Y = np.cumsum(np.random.uniform(0, 10, idx.size))
ts = pd.Series(Y, idx)
fig, axes = plt.subplots(figsize=(10, 6), nrows=3, constrained_layout=True)
ts.plot(kind='bar', ax=axes[0]) # use_index=True is used by defualt
axes[0].xaxis.set_major_locator(mpl.dates.WeekdayLocator(interval=1, byweekday=mpl.dates.MONDAY))
ts.plot(kind='bar', ax=axes[1])
axes[1].xaxis.set_major_locator(mpl.dates.WeekdayLocator(interval=1, byweekday=mpl.dates.MONDAY))
axes[1].xaxis.set_major_formatter(mpl.dates.DateFormatter('%Y-%m-%d'))
axes[2].bar(ts.index, ts.values)
axes[2].xaxis.set_major_locator(mpl.dates.WeekdayLocator(interval=1, byweekday=mpl.dates.MONDAY))
axes[2].xaxis.set_major_formatter(mpl.dates.DateFormatter('%Y-%m-%d'))
我希望所有三个情节大致相同。而且,它们不包括x轴的刻度(应标记星期一的日期)。如我所见,DatetimeIndex
在pandas.Series.plot
中并未真正被正确识别。第一个绘图上的日期是正确的,但是打勾的日期不是星期一。更烦人的是,如果在刻度线(第二个图)上应用了新格式,即使日期错误了!
bar(ts.index, ts.values)
的行为是正确的,并按预期将星期一标记为