这是代码的简化版本,它解释了我正在尝试做的事情:
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'])
这导致了这张图:
我想使用日期时间索引中的年份作为此图上 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()
这给出了错误:
ValueError: ordinal must be >= 1
这好像是来自行
ax.xaxis.set_major_locator(mdates.YearLocator(1))
我认为这与多索引有关,但不明白如何用多索引绘制它。
最佳答案
您可以使用 df.plot
直接从 DataFrame
绘图
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()
编辑
为了只显示年份,我们需要通过设置 x_compat=True
来关闭默认的 pandas
日期格式。
然后,我们可以使用 DateLocator
和 DateFormatter
来自 matplotlib.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()
关于python - 使用 matplotlib 从数据框列的日期时间索引将 x 轴设置为年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549384/