这是代码的简化版本,它解释了我要做什么:
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)
我认为这与多索引有关,但不明白如何使用多索引绘制它。
您可以直接从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.
然后,我们可以使用 aDateLocator和DateFormatterfrommatplotlib.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)