【问题标题】:Plot pandas data frame with year over year data用同比数据绘制 pandas 数据框
【发布时间】:2015-08-03 11:28:52
【问题描述】:

我有一个格式的数据框

              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 或缺失值,则可能非常麻烦。有熊猫的方法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是你想要的吗?您可以在转换后添加均值。

    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()
    

    【讨论】:

    • 真的很棒..正是我想要的。
    【解决方案2】:

    一种可能性是使用“一年中的某天”作为 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 轴日期时间格式。

    【讨论】:

    • 使用 dayofyear-to-calendardate 函数(可能已经有一个),您可以非常直接地重新标记所有 x-ticks。
    • 谢谢! @cphlewis,你有这个转换的例子吗?
    • 如果数据子集包含一年以上(例如回归的输出),这将不起作用。
    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2020-04-24
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多