【问题标题】:Split up time series per year for plotting每年拆分时间序列以进行绘图
【发布时间】:2020-05-25 04:50:02
【问题描述】:

我想绘制一个时间序列,从 2015 年 10 月开始,到 2018 年 2 月结束,在一张图中,每年都是一条线。时间序列为 int64 值,位于 Pandas DataFrame 中。日期在 datetime64[ns] 作为 DataFrame 中的列之一。

我如何从 Jan-Dez 创建一个每年有 4 条线的图表。

graph['share_price'] 和 graph['date'] 被使用。我试过Grouper,但不知何故,它采用了 2015 年 10 月的值并将其与所有其他年份的 1 月值混合在一起。

这个 groupby 接近我想要的,但是我丢失了列表的索引属于哪一年的信息。

graph.groupby('date').agg({'share_price':lambda x: list(x)})

然后我创建了一个有 4 列的 DataFrame,每年 1 列,但我仍然不知道如何继续并以某种方式对这 4 列进行分组,以便我能够以某种方式绘制图表我要。

【问题讨论】:

    标签: python-3.x pandas time-series


    【解决方案1】:

    您可以通过以下方式实现:

    1. 从日期中提取年份
    2. 用不带年份的等效日期替换日期
    3. 将年份和日期都设置为索引
    4. 按年份取消堆叠值

    此时,每一年都会是一列,一年内的每个日期都是一行,所以你可以正常绘制。

    这是一个例子。

    假设您的 DataFrame 看起来像这样:

    >>> import pandas as pd
    >>> import numpy as np
    >>> index = pd.date_range('2015-10-01', '2018-02-28')
    >>> values = np.random.randint(-3, 4, len(index)).cumsum()
    >>> df = pd.DataFrame({
    ...    'date': index,
    ...    'share_price': values
    >>> })
    >>> df.head()
            date  share_price
    0 2015-10-01            0
    1 2015-10-02            3
    2 2015-10-03            2
    3 2015-10-04            5
    4 2015-10-05            4
    >>> df.set_index('date').plot()
    

    您可以按如下方式转换 DataFrame:

    >>> df['year'] = df.date.dt.year
    >>> df['date'] = df.date.dt.strftime('%m-%d')
    >>> unstacked = df.set_index(['year', 'date']).share_price.unstack(-2)
    >>> unstacked.head()
    year   2015  2016  2017  2018
    date                         
    01-01   NaN  28.0 -16.0  21.0
    01-02   NaN  29.0 -14.0  22.0
    01-03   NaN  29.0 -16.0  22.0
    01-04   NaN  26.0 -15.0  23.0
    01-05   NaN  25.0 -16.0  21.0
    

    然后正常绘图:

    unstacked.plot()
    

    【讨论】:

      猜你喜欢
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 2022-01-03
      • 2023-02-07
      • 2016-09-07
      相关资源
      最近更新 更多