我有一个格式为
的数据框 value
2000-01-01 1
2000-03-01 2
2000-06-01 15
2000-09-01 3
2000-12-01 7
2001-01-01 1
2001-03-01 3
2001-06-01 8
2001-09-01 5
2001-12-01 3
2002-01-01 1
2002-03-01 1
2002-06-01 8
2002-09-01 5
2002-12-01 19
(指数是日期时间)我需要逐年绘制所有结果,以比较每3个月的结果(数据也可以是每月),加上所有年份的平均值。
我可以轻松地分别绘制它们,但由于索引,它会根据索引移动绘图:
fig, axes = plt.subplots()
df['2000'].plot(ax=axes, label='2000')
df['2001'].plot(ax=axes, label='2001')
df['2002'].plot(ax=axes, label='2002')
axes.plot(df["2000":'2002'].groupby(df["2000":'2002'].index.month).mean())
所以它不是理想的结果。我在这里似乎有些答案,但你必须连续,创建一个多索引和情节。如果其中一个数据帧具有NaN或缺失值,则可能非常麻烦。有熊猫的方法吗?
答案 0 :(得分:11)
df = pd.DataFrame({'value': [1, 2, 15, 3, 7, 1, 3, 8, 5, 3, 1, 1, 8, 5, 19]},
index=pd.DatetimeIndex(['2000-01-01', '2000-03-01', '2000-06-01', '2000-09-01',
'2000-12-01', '2001-01-01', '2001-03-01', '2001-06-01',
'2001-09-01', '2001-12-01', '2002-01-01', '2002-03-01',
'2002-06-01', '2002-09-01', '2002-12-01']))
pv = pd.pivot_table(df, index=df.index.month, columns=df.index.year,
values='value', aggfunc='sum')
pv
# 2000 2001 2002
# 1 1 1 1
# 3 2 3 1
# 6 15 8 8
# 9 3 5 5
# 12 7 3 19
pv.plot()
答案 1 :(得分:1)
一种可能性是使用'年中的一天'作为x轴。使用x
kwarg将数据框的索引覆盖为x轴:
fig, axes = plt.subplots()
df['2000'].plot(ax=axes, label='2000', x=df['2000'].index.dayofyear)
df['2001'].plot(ax=axes, label='2001', x=df['2001'].index.dayofyear)
或者,您也可以将其添加为列,然后引用列名称。
如果是月度数据,那么您当然也会使用索引的month
属性。
上述方法的缺点是您没有x轴的漂亮日期时间格式。