【问题标题】:Using Pandas to calculate December-January-February average使用 Pandas 计算 12-1-2 月平均值
【发布时间】:2015-12-10 20:17:15
【问题描述】:

我想使用 Pandas 计算数据集中三个不同月份的三个值的平均值,该数据集中在三个不同的列中列出了年、月和感兴趣的值。通常,我只会使用 pandas.loc 和 isin() 和 panads.groupby 函数来执行此操作,但我要分析的季节之一是 12 月-1 月-2 月,它将跨越两个不同年份的数据(即 12 月2000 年,2001 年 1 月,2001 年 2 月)。想知道是否有人对如何处理这类事情有任何建议。

2000  1  5
2000  2  6
2000  3  8
2000  4  10
2000  5  9
2000  6  11
2000  7  13
2000  8  6
2000  9  8
2000  10 7
2000  11 7
2000  12 4
2001  1  3
2001  2  5

(即在这种情况下,2000 年 1 月和 2 月将被忽略,平均值为 MAM:9,JJA:10,SON:7.33,DJF:4)

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    我认为您正在寻找的是rolling_mean

    例如,

    ts
    Out[39]:
    2000-01-31   -1.782781
    2000-02-29    0.976542
    2000-03-31   -1.932712
    2000-04-30    0.098827
    2000-05-31   -0.236521
    2000-06-30   -0.869157
    2000-07-31    0.653783
    2000-08-31    0.341896
    2000-09-30   -0.685596
    2000-10-31   -1.126368
    2000-11-30    0.850350
    2000-12-31   -1.583704
    2001-01-31    1.677160
    2001-02-28    1.872733
    Freq: M, dtype: float64
    

    提供 3 个窗口

    pd.rolling_mean(ts,3)
    Out[40]:
    2000-01-31         NaN
    2000-02-29         NaN
    2000-03-31   -0.912983
    2000-04-30   -0.285781
    2000-05-31   -0.690135
    2000-06-30   -0.335617
    2000-07-31   -0.150632
    2000-08-31    0.042174
    2000-09-30    0.103361
    2000-10-31   -0.490023
    2000-11-30   -0.320538
    2000-12-31   -0.619907
    2001-01-31    0.314602
    2001-02-28    0.655396
    Freq: M, dtype: float64
    

    这也会计算重叠范围,您可以忽略。

    【讨论】:

      【解决方案2】:

      添加一个新列,该列从现有数据中生成“月份 ID”,其值例如为 (year - 2000)*12 + (month - 2)。然后按这个新值分组。

      【讨论】:

        【解决方案3】:

        您可以定义自定义季度并使用groupby

        # Test data
        df = pd.DataFrame({'month': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2],
                           'year': [2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2001, 2001],
                           'value': [5.0, 6.0, 8.0, 10.0, 9.0, 11.0, 13.0, 6.0, 8.0, 7, 7, 4, 3.0, 5.0]})
        
        # Custom quarters definition
        quarters = {1: 'DJF', 2: 'DJF', 3: 'MAM', 4: 'MAM', 5: 'MAM', 6: 'JJA', 7: 'JJA', 8: 'JJA', 9: 'SON', 10: 'SON', 11: 'SON', 
            12: 'DJF'}
        
        df = df.set_index(['month'])
        
        # can be grouped by year and quarters
        df.groupby(['year',quarters])['value'].mean()
        
        year     
        2000  DJF     5.000000
              JJA    10.000000
              MAM     9.000000
              SON     7.333333
        2001  DJF     4.000000
        
        # or only by quarters according to the needs
        df.groupby(quarters)['value'].mean()
        
        DJF     4.600000
        JJA    10.000000
        MAM     9.000000
        SON     7.333333
        

        【讨论】:

        • 我不认为这是正确的。您想要“跨两年”的平均值。此处概述的方法为您提供了同一年 1-2 月和 12 月的平均值。如何获得 2000 年 12 月和 2001 年 1 月至 2 月的平均值?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-22
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 2019-08-29
        • 2019-09-09
        • 2019-03-07
        相关资源
        最近更新 更多