我有一个由年,月,温度组成的数据框。现在,我需要创建季节性方法,例如DJF(12月,1月,2月),MAM(3月,4月,5月),JJA(6月,7月,8月),SON(9月,10月,11月)。

但是,我如何考虑DJF应该在上一年的12月,下一年的1月和2月呢?

这是我到目前为止的代码:

z = {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['season'] = df['Mon'].map(z)


上述编码的问题在于,当我按年份和季节分组以计算均值时,DJF的值将是不正确的,因为它们采用的是同一年的12月,1月和2月。

df.groupby(['Year','season']).mean()

最佳答案

我认为您可以通过to_datetimeto_period创建periodindex

然后shift一蛾,并通过Quarters转换为asfreq

根据索引和汇总groupby的最后mean

df['Day'] = 1
df.index = pd.to_datetime(df[['Year','Month','Day']]).dt.to_period('M')
df = df.shift(1, freq='M').asfreq('Q')

print (df.groupby(level=0)['Temperature'].mean())


样品:

rng = pd.date_range('2017-04-03', periods=20, freq='M')
df = pd.DataFrame({'Date': rng, 'Temperature': range(20)})
df['Year'] = df.Date.dt.year
df['Month'] = df.Date.dt.month
df = df.drop('Date', axis=1)
print (df)
    Temperature  Year  Month
0             0  2017      4
1             1  2017      5
2             2  2017      6
3             3  2017      7
4             4  2017      8
5             5  2017      9
6             6  2017     10
7             7  2017     11
8             8  2017     12
9             9  2018      1
10           10  2018      2
11           11  2018      3
12           12  2018      4
13           13  2018      5
14           14  2018      6
15           15  2018      7
16           16  2018      8
17           17  2018      9
18           18  2018     10
19           19  2018     11




df['Day'] = 1
df.index = pd.to_datetime(df[['Year','Month','Day']]).dt.to_period('M')
df = df.shift(1, freq='M').asfreq('Q')
print (df)
        Temperature  Year  Month  Day
2017Q2            0  2017      4    1
2017Q2            1  2017      5    1
2017Q3            2  2017      6    1
2017Q3            3  2017      7    1
2017Q3            4  2017      8    1
2017Q4            5  2017      9    1
2017Q4            6  2017     10    1
2017Q4            7  2017     11    1
2018Q1            8  2017     12    1
2018Q1            9  2018      1    1
2018Q1           10  2018      2    1
2018Q2           11  2018      3    1
2018Q2           12  2018      4    1
2018Q2           13  2018      5    1
2018Q3           14  2018      6    1
2018Q3           15  2018      7    1
2018Q3           16  2018      8    1
2018Q4           17  2018      9    1
2018Q4           18  2018     10    1
2018Q4           19  2018     11    1




print (df.groupby(level=0)['Temperature'].mean())
2017Q2     0.5
2017Q3     3.0
2017Q4     6.0
2018Q1     9.0
2018Q2    12.0
2018Q3    15.0
2018Q4    18.0
Freq: Q-DEC, Name: Temperature, dtype: float64


最后,如果需要season列:

df1 = df.groupby(level=0)['Temperature'].mean().rename_axis('per').reset_index()
z = {1: 'DJF',2: 'MAM', 3: 'JJA', 4: 'SON'}
df1['season'] = df1['per'].dt.quarter.map(z)
df1['yaer'] = df1['per'].dt.year
print (df1)
     per  Temperature season  yaer
0 2017Q2          0.5    MAM  2017
1 2017Q3          3.0    JJA  2017
2 2017Q4          6.0    SON  2017
3 2018Q1          9.0    DJF  2018
4 2018Q2         12.0    MAM  2018
5 2018Q3         15.0    JJA  2018
6 2018Q4         18.0    SON  2018

10-02 10:13