使用 DateFormatter 将开始日期重置为 1970 年

Fre*_*ell 4 python datetime matplotlib dataframe pandas

我有一个数据框,其中索引是每个月的第一个日期,size列是该月的频率,例如

显示每月 1 号日期和频率列表的表格

在数据帧上使用.index确认索引的类型是DatetimeIndex

DatetimeIndex(['2006-12-01', ...],
              dtype='datetime64[ns]', name='created_at_month', length=175, freq=None)
Run Code Online (Sandbox Code Playgroud)

在 DataFrame 上使用.plot()我可以每月生成一个折线图:

在此输入图像描述

但是,它仅在 x 轴上每隔一年列出一次,我希望它在轴上列出每年。

我希望能够做到

DatetimeIndex(['2006-12-01', ...],
              dtype='datetime64[ns]', name='created_at_month', length=175, freq=None)
Run Code Online (Sandbox Code Playgroud)

然而,这根本不输出任何标签。

如果我添加一个次要格式化程序 ( ax.xaxis.set_minor_formatter(mdates.DateFormatter('%d %m %Y'))),我会得到以下结果:

在此输入图像描述

我在这里做错了什么导致日期改变?

相关版本有:

  • Matplotlib:3.3.4
  • 熊猫:1.2.4
  • 蟒蛇:3.8.8

Zep*_*hyr 5

正如此处报道的,由于某种原因pandas,情节显示了这个问题。
您可以通过将pandas'plot 替换为来解决这个问题matplotlib.pyplot.plot
您可以将此答案作为 x 轴上 2 个日期时间刻度的参考(月和年,或月和日,或日和小时,根据需要),在次要刻度和主要刻度处使用两个不同的轴。

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


df = pd.DataFrame({'created_at_month': pd.date_range(start = '2006-12-01', end = '2020-12-01', freq = 'MS')})
df['size'] = np.random.randint(0, 200, len(df))
df = df.set_index('created_at_month')


fig, ax = plt.subplots()

ax.plot(df.index, df['size'])

ax.xaxis.set_major_locator(mdates.YearLocator(base = 1, month = 1, day = 1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 怎么2年后这个问题仍然存在? (2认同)