【问题标题】:Using DateFormatter resets starting date to 1970使用 DateFormatter 将开始日期重置为 1970
【发布时间】:2021-11-05 02:51:36
【问题描述】:

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

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

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

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

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

我希望能够做到

ax.xaxis.set_major_locator(mdates.YearLocator(1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))

但是这根本不输出任何标签。

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

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

相关版本有:

  • Matplotlib:3.3.4
  • 熊猫:1.2.4
  • Python:3.8.8

【问题讨论】:

  • 让我猜你想在 X 轴上显示所有年份?
  • 是的,我希望将所有年份标记为主要刻度,然后理想情况下将所有月份标记为次要刻度,但我希望先工作几年
  • 您介意分享一个可重现的最小示例吗?
  • 这是一个最小的例子,我会检查第一个答案是否解决了这个问题colab.research.google.com/drive/…

标签: python pandas dataframe datetime matplotlib


【解决方案1】:

正如here 所报告的那样,出于某种原因pandas 的情节显示了这个问题。
您可以通过将 pandas' 情节替换为 matplotlib.pyplot.plot 来解决此问题。
您可以将 this answer 作为 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多