A' pythonic'从pandas timeseries数据帧生成季节性数据帧的方法

时间:2017-11-13 08:06:51

标签: python pandas

我有一个pandas数据框,可以捕获超过一个时间的值(可能是每月一次,或每天多年,或每天多月)。无法保证时间序列是连续的(一年中可能缺少几个月)

""" no guarantee that this index will have an entry for every month of the time range!"""
dates = pd.date_range('1/1/2015', periods=36, freq='M')
df = pd.DataFrame(index = dates)
df['value'] = df.index.year * 0.1 + df.index.month * 0.05
df.plot()

它可以给我一个简单的时间序列图

enter image description here 但我想做的是一个季节性的'情节。这会将每年的数据显示为相同月份指数的不同行。作为一个简单的显示:

import numpy as np
index = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
df = pd.DataFrame(index = index)
df[2015] = np.arange(12)*0.4+1
df[2016] = np.arange(12)*0.35+1.4
df[2017] = np.arange(12)*0.5+1.2

df.plot()

enter image description here

我正在寻找一个' pythonic'或优雅的方式来做这个操作。我改造的尝试非常严重,意大利面,垃圾代码。我确信必须有一些整洁的方法使用pandas / python来有效和干净地显示这种转换特别是,我想找到一种抽象的方法来做到这一点,这样我就可以将它概括为使图表显示"季节性&# 34;等一个月的日子等等。

首先,我甚至不确定构建此图表的基础是什么好的索引。

1 个答案:

答案 0 :(得分:3)

您可以使用DatetimeIndex.strftimeDatetimeIndex.year并使用sorted CategoricalIndex进行正确的排序,最后通过pivot重新塑造:

c = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

df = pd.pivot(index=pd.CategoricalIndex(df.index.strftime('%b'), ordered=True, categories=c),
              columns=df.index.year,
              values=df['value'])
print (df)

       2015    2016    2017
Jan  201.55  201.65  201.75
Feb  201.60  201.70  201.80
Mar  201.65  201.75  201.85
Apr  201.70  201.80  201.90
May  201.75  201.85  201.95
Jun  201.80  201.90  202.00
Jul  201.85  201.95  202.05
Aug  201.90  202.00  202.10
Sep  201.95  202.05  202.15
Oct  202.00  202.10  202.20
Nov  202.05  202.15  202.25
Dec  202.10  202.20  202.30

df.plot()

另一种解决方案是创建新列:

df['months'] = pd.CategoricalIndex(df.index.strftime('%b'), ordered=True, categories=c)
df['years'] = df.index.year
df = df.pivot(index='months', columns='years',values='value')