使用 matplotlib 从数据框列的日期时间索引中将 x 轴设置为年份

Pad*_*Pad 4 python matplotlib

这是代码的简化版本,它解释了我要做什么:

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

dates = pd.date_range('20070101',periods=1000)
df = pd.DataFrame(np.random.randn(1000), index = dates, columns =list ('A'))

plt.plot(df['A'])
Run Code Online (Sandbox Code Playgroud)

这导致了这个图表:

在此处输入图片说明

我想使用日期时间索引中的年份作为此图上 x 轴的标签,而不是数据点数/天数。我想要基于日期时间索引的2007、2008、2009 等(因为这会根据我的输入数据而有所不同)。

我已经为此查看了每个帮助站点,但似乎没有任何效果,我可能遗漏了一些非常明显的内容,对此我深表歉意,但我无法弄清楚。

编辑

用于说明错误的新代码:

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

dates = pd.date_range('20070101',periods=1000)
df = pd.DataFrame(np.random.randn(1000), columns =list ('A'))
df['date'] = dates

def get_season(row):
    if row['date'].month >= 3 and row['date'].month <= 5:
        return 'spring'
    elif row['date'].month >= 6 and row['date'].month <= 8:
        return 'summer'
    elif row['date'].month >= 9 and row['date'].month <= 11:
        return 'autumn'
    else:
        return 'winter'

df['Season'] = df.apply(get_season, axis=1)
df['Year'] = df['date'].dt.year
df.loc[df['date'].dt.month == 12, 'Year'] += 1
df = df.set_index(['Year', 'Season'], inplace=False)

df.head()

fig,ax = plt.subplots()
df.plot(x_compat=True,ax=ax)

ax.xaxis.set_tick_params(reset=True)
ax.xaxis.set_major_locator(mdates.YearLocator(1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))

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

这给出了错误:

ValueError: ordinal must be >= 1
Run Code Online (Sandbox Code Playgroud)

这似乎来自行

ax.xaxis.set_major_locator(mdates.YearLocator(1))
Run Code Online (Sandbox Code Playgroud)

我认为这与多索引有关,但不明白如何使用多索引绘制它。

tmd*_*son 6

您可以直接从DataFrameusing绘图df.plot

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

dates = pd.date_range('20070101',periods=1000)
df = pd.DataFrame(np.random.randn(1000), index = dates, columns =list ('A'))

df.plot()

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

在此处输入图片说明

编辑

为了只显示年份,我们需要关闭默认的pandas日期格式,通过设置x_compat=True.

然后,我们可以使用 aDateLocatorDateFormatterfrommatplotlib.dates来只使用年份。

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

dates = pd.date_range('20070101',periods=1000)
df = pd.DataFrame(np.random.randn(1000), index = dates, columns =list ('A'))

fig,ax = plt.subplots()
df.plot(x_compat=True,ax=ax)

ax.xaxis.set_tick_params(reset=True)
ax.xaxis.set_major_locator(mdates.YearLocator(1))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))

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

在此处输入图片说明

  • 谢谢!我使用了你的代码,并编辑它以满足我的需要,这是在 MONTH -&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; new_hash_per_day_plot.xaxis.set_major_locator(dates.MonthLocator()) new_hash_per_day_plot.xaxis.set_major_formatter(dates.DateFormatter) ('%m')) (2认同)