Pandas 如何计算月平均值?

Pandas 如何计算月平均值?,pandas,Pandas,我有这个df: CODE TMAX TMIN PP DATE 1991-01-01 000130 32.6 23.4 0.0 1991-01-02 000130 31.2 22.4 0.0 1991-01-03 000130 32.0 NaN 0.0 1991-01-04 000130 32.2 23.0 0.0 1991-01-05 000130 30.5 2

我有这个df:

            CODE    TMAX  TMIN   PP
DATE                              
1991-01-01  000130  32.6  23.4  0.0
1991-01-02  000130  31.2  22.4  0.0
1991-01-03  000130  32.0   NaN  0.0
1991-01-04  000130  32.2  23.0  0.0
1991-01-05  000130  30.5  22.0  0.0
           ...   ...   ...  ...
2020-12-27  158328   NaN   NaN  NaN
2020-12-28  158328   NaN   NaN  NaN
2020-12-29  158328   NaN   NaN  NaN
2020-12-30  158328   NaN   NaN  NaN
2020-12-31  158328   NaN   NaN  NaN
我有每个代码30年(1991-2020)的数据,我想计算TMAX、TMIN和PP的月平均值。所以对于TMAX和TMIN,我应该计算每个月的平均值,所以如果1月有31天,我应该得到这31个值的平均值,并得到1991年1月、1992年1月等的值。所以我将有30个1月(1991年1月,1992年1月,…,2020年1月),2月30日,等等。在此之后,我应该计算每组月的平均值(1月与1月,2月与2月,等等)。因此我将有12个值(每个月一个值)。例如: (1991年1月+1992年1月+2020年1月)/30 (1991年2月+1992年2月+2020年2月)/30 ..每个月的分组相同

所以我使用这个代码,但我不知道它是否正常

from datetime import date
normalstemp=df[['CODE','TMAX','TMIN']].groupby([df.CODE, df.index.month]).mean().round(1)
对于PP(降水量),我应该计算当月每个PP值的总和,因此,如果1月有31天,我应该将它们的所有值相加,得到1991年1月、1992年1月等的值。因此,我将有30个1月(1991年1月、1992年1月、…、2020年1月)、30个2月(1991年2月、1992年2月、…、2020年2月)在这之后,我应该计算每组月份的平均值(一月和一月,二月和二月,等等)。因此我将有12个值(每个月一个值,与TMAX和TMIN相同)

例如: (1991年1月+1992年1月+2020年1月)/30 (1991年2月+1992年2月+2020年2月)/30 ..每个月的分组相同

所以我使用这个代码,但我知道这个代码是不正确的,因为我没有得到1月,2月等的平均值

normalspp=df[['CODE','PP']].groupby([df.CODE, df.index.month]).sum().round(1)
我只有python的基本知识,如果您能帮助我,我将不胜感激

提前感谢。

Ver 2:按年度、月份和月份计算的平均值 如果要为TMAX平均值命名,可以添加reset_索引并重命名列

print (df.groupby(['Code','Year_Mon'])['TMAX'].mean().reset_index().rename(columns={'TMAX':'TMAX_Avg'}))
其输出将为:

         Date    Code  TMAX  TMIN Year_Mon  TMAX_Avg  TMIN_Avg
0  2018-01-01  000130     8     2  2018-01  7.451613  2.129032
1  2018-01-02  000130     7     4  2018-01  7.451613  2.129032
2  2018-01-03  000130     9     2  2018-01  7.451613  2.129032
3  2018-01-04  000130     6     1  2018-01  7.451613  2.129032
4  2018-01-05  000130     9     4  2018-01  7.451613  2.129032
5  2018-01-06  000130     6     1  2018-01  7.451613  2.129032
6  2018-01-07  000130     9     2  2018-01  7.451613  2.129032
7  2018-01-08  000130     9     2  2018-01  7.451613  2.129032
8  2018-01-09  000130     7     2  2018-01  7.451613  2.129032
9  2018-01-10  000130     8     2  2018-01  7.451613  2.129032
10 2018-01-11  000130     8     3  2018-01  7.451613  2.129032
11 2018-01-12  000130     7     2  2018-01  7.451613  2.129032
12 2018-01-13  000130     7     1  2018-01  7.451613  2.129032
13 2018-01-14  000130     8     1  2018-01  7.451613  2.129032
14 2018-01-15  000130     7     3  2018-01  7.451613  2.129032
15 2018-01-16  000130     6     1  2018-01  7.451613  2.129032
16 2018-01-17  000130     6     3  2018-01  7.451613  2.129032
17 2018-01-18  000130     9     3  2018-01  7.451613  2.129032
18 2018-01-19  000130     7     2  2018-01  7.451613  2.129032
19 2018-01-20  000130     8     1  2018-01  7.451613  2.129032
20 2018-01-21  000130     9     4  2018-01  7.451613  2.129032
21 2018-01-22  000130     6     2  2018-01  7.451613  2.129032
22 2018-01-23  000130     9     4  2018-01  7.451613  2.129032
23 2018-01-24  000130     6     2  2018-01  7.451613  2.129032
24 2018-01-25  000130     8     3  2018-01  7.451613  2.129032
25 2018-01-26  000130     6     2  2018-01  7.451613  2.129032
26 2018-01-27  000130     8     1  2018-01  7.451613  2.129032
27 2018-01-28  000130     8     3  2018-01  7.451613  2.129032
28 2018-01-29  000130     6     1  2018-01  7.451613  2.129032
29 2018-01-30  000130     6     1  2018-01  7.451613  2.129032
30 2018-01-31  000130     8     1  2018-01  7.451613  2.129032
31 2018-02-01  000130     7     1  2018-02  7.250000  2.428571
32 2018-02-02  000130     6     2  2018-02  7.250000  2.428571
33 2018-02-03  000130     6     4  2018-02  7.250000  2.428571
34 2018-02-04  000130     8     3  2018-02  7.250000  2.428571
35 2018-02-05  000130     8     2  2018-02  7.250000  2.428571
36 2018-02-06  000130     6     3  2018-02  7.250000  2.428571
37 2018-02-07  000130     6     3  2018-02  7.250000  2.428571
38 2018-02-08  000130     7     1  2018-02  7.250000  2.428571
39 2018-02-09  000130     9     4  2018-02  7.250000  2.428571
40 2018-02-10  000130     8     2  2018-02  7.250000  2.428571
41 2018-02-11  000130     7     4  2018-02  7.250000  2.428571
42 2018-02-12  000130     8     1  2018-02  7.250000  2.428571
43 2018-02-13  000130     6     4  2018-02  7.250000  2.428571
44 2018-02-14  000130     6     1  2018-02  7.250000  2.428571
45 2018-02-15  000130     6     4  2018-02  7.250000  2.428571
46 2018-02-16  000130     8     2  2018-02  7.250000  2.428571
47 2018-02-17  000130     7     3  2018-02  7.250000  2.428571
48 2018-02-18  000130     9     3  2018-02  7.250000  2.428571
49 2018-02-19  000130     8     2  2018-02  7.250000  2.428571
每个代码每年每月的TMAX平均值

Code    Year_Mon
000130  1991-01     7.225806
        1991-02     7.678571
        1991-03     7.354839
        1991-04     7.500000
        1991-05     7.516129
                      ...   
158328  2020-08     7.387097
        2020-09     7.300000
        2020-10     7.516129
        2020-11     7.500000
        2020-12     7.451613
Name: TMAX, Length: 720, dtype: float64
Code    Year_Mon
000130  1991-01     2.419355
        1991-02     2.571429
        1991-03     2.193548
        1991-04     2.366667
        1991-05     2.451613
                      ...   
158328  2020-08     2.451613
        2020-09     2.566667
        2020-10     2.612903
        2020-11     2.666667
        2020-12     2.580645
Name: TMIN, Length: 720, dtype: float64
每个代码每年每月的TMIN平均值

Code    Year_Mon
000130  1991-01     7.225806
        1991-02     7.678571
        1991-03     7.354839
        1991-04     7.500000
        1991-05     7.516129
                      ...   
158328  2020-08     7.387097
        2020-09     7.300000
        2020-10     7.516129
        2020-11     7.500000
        2020-12     7.451613
Name: TMAX, Length: 720, dtype: float64
Code    Year_Mon
000130  1991-01     2.419355
        1991-02     2.571429
        1991-03     2.193548
        1991-04     2.366667
        1991-05     2.451613
                      ...   
158328  2020-08     2.451613
        2020-09     2.566667
        2020-10     2.612903
        2020-11     2.666667
        2020-12     2.580645
Name: TMIN, Length: 720, dtype: float64
每个代码每个月的TMAX平均值(所有年份的总和)

每个代码每月TMIN的平均值(所有年份的总和)

版本1:每个代码的年和月平均值 这里有一种方法可以做到这一点

您可以创建两列-年和月。然后通过执行
groupby('code','Year\u Mon')

有关更多详细信息,请参见代码

import pandas as pd
import numpy as np

# create a range of dates from 1/1/2018 thru 12/31/2020 for each day

x = pd.date_range(start='1/1/2018', end='12/31/2020',freq='D')

# create a dataframe with the date ranges x 2 for two codes
# TMIN is a random value from 1 thru 5  - you can put your actual data here
# TMAX is a random value from 6 thru 10 - you can put your actual data here

df = pd.DataFrame({'Date':x.tolist()*2,
                   'Code':['000130']*1096 + ['158328']*1096,
                   'TMAX': np.random.randint(6,10, size=2192),
                   'TMIN': np.random.randint(1,5, size=2192)
                  })

# Create a Year-Month column using df.Date.dt.strftime

df['Year_Mon'] = df.Date.dt.strftime('%Y-%m')

# Calculate the Average of TMAX and TMIN using groupby Code and Year_Mon

df['TMAX_Avg'] = df.groupby(['Code','Year_Mon'])['TMAX'].transform('mean')
df['TMIN_Avg'] = df.groupby(['Code','Year_Mon'])['TMIN'].transform('mean')
其输出将为:

         Date    Code  TMAX  TMIN Year_Mon  TMAX_Avg  TMIN_Avg
0  2018-01-01  000130     8     2  2018-01  7.451613  2.129032
1  2018-01-02  000130     7     4  2018-01  7.451613  2.129032
2  2018-01-03  000130     9     2  2018-01  7.451613  2.129032
3  2018-01-04  000130     6     1  2018-01  7.451613  2.129032
4  2018-01-05  000130     9     4  2018-01  7.451613  2.129032
5  2018-01-06  000130     6     1  2018-01  7.451613  2.129032
6  2018-01-07  000130     9     2  2018-01  7.451613  2.129032
7  2018-01-08  000130     9     2  2018-01  7.451613  2.129032
8  2018-01-09  000130     7     2  2018-01  7.451613  2.129032
9  2018-01-10  000130     8     2  2018-01  7.451613  2.129032
10 2018-01-11  000130     8     3  2018-01  7.451613  2.129032
11 2018-01-12  000130     7     2  2018-01  7.451613  2.129032
12 2018-01-13  000130     7     1  2018-01  7.451613  2.129032
13 2018-01-14  000130     8     1  2018-01  7.451613  2.129032
14 2018-01-15  000130     7     3  2018-01  7.451613  2.129032
15 2018-01-16  000130     6     1  2018-01  7.451613  2.129032
16 2018-01-17  000130     6     3  2018-01  7.451613  2.129032
17 2018-01-18  000130     9     3  2018-01  7.451613  2.129032
18 2018-01-19  000130     7     2  2018-01  7.451613  2.129032
19 2018-01-20  000130     8     1  2018-01  7.451613  2.129032
20 2018-01-21  000130     9     4  2018-01  7.451613  2.129032
21 2018-01-22  000130     6     2  2018-01  7.451613  2.129032
22 2018-01-23  000130     9     4  2018-01  7.451613  2.129032
23 2018-01-24  000130     6     2  2018-01  7.451613  2.129032
24 2018-01-25  000130     8     3  2018-01  7.451613  2.129032
25 2018-01-26  000130     6     2  2018-01  7.451613  2.129032
26 2018-01-27  000130     8     1  2018-01  7.451613  2.129032
27 2018-01-28  000130     8     3  2018-01  7.451613  2.129032
28 2018-01-29  000130     6     1  2018-01  7.451613  2.129032
29 2018-01-30  000130     6     1  2018-01  7.451613  2.129032
30 2018-01-31  000130     8     1  2018-01  7.451613  2.129032
31 2018-02-01  000130     7     1  2018-02  7.250000  2.428571
32 2018-02-02  000130     6     2  2018-02  7.250000  2.428571
33 2018-02-03  000130     6     4  2018-02  7.250000  2.428571
34 2018-02-04  000130     8     3  2018-02  7.250000  2.428571
35 2018-02-05  000130     8     2  2018-02  7.250000  2.428571
36 2018-02-06  000130     6     3  2018-02  7.250000  2.428571
37 2018-02-07  000130     6     3  2018-02  7.250000  2.428571
38 2018-02-08  000130     7     1  2018-02  7.250000  2.428571
39 2018-02-09  000130     9     4  2018-02  7.250000  2.428571
40 2018-02-10  000130     8     2  2018-02  7.250000  2.428571
41 2018-02-11  000130     7     4  2018-02  7.250000  2.428571
42 2018-02-12  000130     8     1  2018-02  7.250000  2.428571
43 2018-02-13  000130     6     4  2018-02  7.250000  2.428571
44 2018-02-14  000130     6     1  2018-02  7.250000  2.428571
45 2018-02-15  000130     6     4  2018-02  7.250000  2.428571
46 2018-02-16  000130     8     2  2018-02  7.250000  2.428571
47 2018-02-17  000130     7     3  2018-02  7.250000  2.428571
48 2018-02-18  000130     9     3  2018-02  7.250000  2.428571
49 2018-02-19  000130     8     2  2018-02  7.250000  2.428571
如果只需要代码、年-月、TMIN和TMAX值,可以执行以下操作:

一年内每个月的TMAX平均值:

print (df.groupby(['Code','Year_Mon'])['TMAX'].mean())
print (df.groupby(['Code','Year_Mon'])['TMIN'].mean())
输出将是:

Code    Year_Mon
000130  2018-01     7.451613
        2018-02     7.250000
        2018-03     7.774194
        2018-04     7.366667
        2018-05     7.451613
                      ...   
158328  2020-08     7.935484
        2020-09     7.666667
        2020-10     7.548387
        2020-11     7.333333
        2020-12     7.580645
Code    Year_Mon
000130  2018-01     2.129032
        2018-02     2.428571
        2018-03     2.451613
        2018-04     2.500000
        2018-05     2.677419
                      ...   
158328  2020-08     2.709677
        2020-09     2.166667
        2020-10     2.161290
        2020-11     2.366667
        2020-12     2.548387
一年内每个月的TMIN平均值:

print (df.groupby(['Code','Year_Mon'])['TMAX'].mean())
print (df.groupby(['Code','Year_Mon'])['TMIN'].mean())
输出将是:

Code    Year_Mon
000130  2018-01     7.451613
        2018-02     7.250000
        2018-03     7.774194
        2018-04     7.366667
        2018-05     7.451613
                      ...   
158328  2020-08     7.935484
        2020-09     7.666667
        2020-10     7.548387
        2020-11     7.333333
        2020-12     7.580645
Code    Year_Mon
000130  2018-01     2.129032
        2018-02     2.428571
        2018-03     2.451613
        2018-04     2.500000
        2018-05     2.677419
                      ...   
158328  2020-08     2.709677
        2020-09     2.166667
        2020-10     2.161290
        2020-11     2.366667
        2020-12     2.548387

你想计算每年内每个月的平均值吗?我会更具体。首先我想计算每个月的平均值。所以我想计算1991年1月、1992年1月、1991年2月、1992年2月、1991年12月、1992年12月、2020年12月的平均值。然后我想计算每组月的平均值,如is:(1991年1月+1992年1月+2020年1月)/30,(1991年2月+1992年2月+2020年2月)/30等。根据代码,这些值必须是12个值。1991年和2020年之间有30年。因此,您需要360个月的平均值,然后您需要12个月的平均值-每个月一个(30年的平均值为同一个月)。是否正确?请使用评论部分中的信息更新您的问题。如果更新的版本解决了问题,我将修改我的代码并简要分享结果