每年分割时间序列以进行绘图

cca*_*444 0 time-series python-3.x pandas

我想绘制一个时间序列,从 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)})
Run Code Online (Sandbox Code Playgroud)

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

Car*_*ala 6

您可以通过以下方式实现这一目标:

  1. 从日期中提取年份
  2. 将日期替换为不带年份的等效日期
  3. 将年份设置为列,将日期设置为索引

此时,每年将是一列,一年中的每个日期将是一行,因此您可以正常绘制。

这是一个例子。

假设你的 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

>>> df['year'] = df.date.dt.year
>>> df['date'] = df.date.dt.strftime('%m-%d')
>>> unstacked = df.pivot(index='date', columns='year', values='share_price')
>>> 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
Run Code Online (Sandbox Code Playgroud)

并正常绘制:

unstacked.plot()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述