【问题标题】:How to pick a season/month over several years from a pandas dataframe?如何从熊猫数据框中选择几年的季节/月份?
【发布时间】:2018-06-14 21:10:39
【问题描述】:

我有一个熊猫数据框,其中包含连续三年的数据... 有没有简单的方法来选择夏季/冬季?

目前,我这样做:

df_summer = df[((df.index.month > 5) & (df.index.month < 9))]
df_winter = df[((df.index.month < 3) | (df.index.month == 12))]

但是从 xarray 我习惯了这样的符号:

xa_summer = xa[xa.dt.season=='JJA']

一年我能做到:

df_summer = df['YYYYMMDDHH':'YYYYMMDDHH']

有没有更直观的方式来选择 pandas 多年的季节?

谢谢...

【问题讨论】:

    标签: pandas date-range


    【解决方案1】:

    pandas yet中没有实现。

    一个想法是通过 12 模创建助手 season,添加 3,除以 3 和最后 map 按字典:

    rng = pd.date_range('2017-04-03', periods=40, freq='MS')
    df = pd.DataFrame({'a': range(40)}, index=rng)  
    #print (df)
    
    season = ((df.index.month % 12 + 3) // 3).map({1:'DJF', 2: 'MAM', 3:'JJA', 4:'SON'})
    print (season)
    Index(['MAM', 'JJA', 'JJA', 'JJA', 'SON', 'SON', 'SON', 'DJF', 'DJF', 'DJF',
           'MAM', 'MAM', 'MAM', 'JJA', 'JJA', 'JJA', 'SON', 'SON', 'SON', 'DJF',
           'DJF', 'DJF', 'MAM', 'MAM', 'MAM', 'JJA', 'JJA', 'JJA', 'SON', 'SON',
           'SON', 'DJF', 'DJF', 'DJF', 'MAM', 'MAM', 'MAM', 'JJA', 'JJA', 'JJA'],
          dtype='object')
    

    df_summer = df[season == 'JJA']
    print (df_summer)
                 a
    2017-06-01   1
    2017-07-01   2
    2017-08-01   3
    2018-06-01  13
    2018-07-01  14
    2018-08-01  15
    2019-06-01  25
    2019-07-01  26
    2019-08-01  27
    2020-06-01  37
    2020-07-01  38
    2020-08-01  39
    
    df_winter = df[season == 'DJF']
    print (df_winter)
                 a
    2017-12-01   7
    2018-01-01   8
    2018-02-01   9
    2018-12-01  19
    2019-01-01  20
    2019-02-01  21
    2019-12-01  31
    2020-01-01  32
    2020-02-01  33
    

    或创建新列:

    df_summer = df[df['season'] == 'JJA']
    print (df_summer)
                 a season
    2017-06-01   1    JJA
    2017-07-01   2    JJA
    2017-08-01   3    JJA
    2018-06-01  13    JJA
    2018-07-01  14    JJA
    2018-08-01  15    JJA
    2019-06-01  25    JJA
    2019-07-01  26    JJA
    2019-08-01  27    JJA
    2020-06-01  37    JJA
    2020-07-01  38    JJA
    2020-08-01  39    JJA
    
    df_winter = df[df['season'] == 'DJF']
    print (df_winter)
                 a season
    2017-12-01   7    DJF
    2018-01-01   8    DJF
    2018-02-01   9    DJF
    2018-12-01  19    DJF
    2019-01-01  20    DJF
    2019-02-01  21    DJF
    2019-12-01  31    DJF
    2020-01-01  32    DJF
    2020-02-01  33    DJF
    

    另一个想法是按月使用Index.isin

    df_summer = df[df.index.month.isin([6,7,8])]
    print (df_summer)
                 a
    2017-06-01   1
    2017-07-01   2
    2017-08-01   3
    2018-06-01  13
    2018-07-01  14
    2018-08-01  15
    2019-06-01  25
    2019-07-01  26
    2019-08-01  27
    2020-06-01  37
    2020-07-01  38
    2020-08-01  39
    
    df_winter = df[df.index.month.isin([12,1,2])]
    print (df_winter)
                 a
    2017-12-01   7
    2018-01-01   8
    2018-02-01   9
    2018-12-01  19
    2019-01-01  20
    2019-02-01  21
    2019-12-01  31
    2020-01-01  32
    2020-02-01  33
    

    【讨论】:

    • 非常感谢,我可能会使用 Index.isin 方法,但有替代方法很好......
    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 2017-06-14
    • 2019-10-14
    • 2015-09-06
    • 2020-10-06
    • 2022-11-27
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多