【问题标题】:A 'pythonic' way to generate a seasonal dataframe from a pandas timeseries dataframe从熊猫时间序列数据帧生成季节性数据帧的“pythonic”方法
【发布时间】:2017-11-13 08:06:50
【问题描述】:

我有一个 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()

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

但我想做的是一个“季节性”的情节。这会将每年的数据显示为同一月份索引上的不同行。作为一个简单的展示:

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

我正在寻找一种“pythonic”或优雅的方式来执行此操作。我的转型尝试令人难以置信的粗俗,意大利面条,垃圾代码。我确信必须有一些整洁的方法使用 pandas/python 来有效和干净地显示这种转换。特别是,我想找到一种抽象的方法来做到这一点,这样我就可以将其推广到制作显示“季节性”天数的图表一个月等等。

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用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')
    

    【讨论】:

    • 不客气!我删除了第一个解决方案,因为它更干净;)
    • 这非常有用 - 有没有办法对日常数据执行此操作?即每一列都有该特定年份的每日值?
    • @spcol - 你认为将columns=df.index.year 更改为columns=df.index.date 吗?
    • 非常感谢您的回复!这似乎导致列标题是每天而不是索引是每天,然后索引仍然是每月一次,这是有道理的 - 也许我可以从那里开始工作。
    猜你喜欢
    • 2020-11-15
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2021-01-20
    • 2017-08-03
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多