如何计算月平均值?

时间:2021-03-23 01:57:38

标签: 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  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

我有每个 CODE 的 30 年(1991-2020)数据,我想计算 TMAX、TMIN 和 PP 的月平均值。所以对于 TMAX 和 TMIN,我应该计算每个月的平均值,所以如果 1 月有 31 天,我应该得到这 31 个值的平均值,并得到 1991 年 1 月、1992 年 1 月等的值。所以我将有 30 个一月(一月1991,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 一月(1991 年 1 月,1992 年 1 月,...,2020 年一月),2 月 30 日(1991 年 2 月,1992 年 2 月,...,2020 年 2 月)等。之后我应该计算每组月份的平均值(一月与一月,二月与二月,等等)。所以我将有 12 个值(每个月一个值,与 TMAX 和 TMIN 相同)。

示例: (1991 年 1 月 + 1992 年 1 月 + ..... + 2020 年 1 月)/30 (1991 年 2 月 + 1992 年 2 月 + ..... + 2020 年 2 月)/30 .... 每一组月份都一样。

所以我使用了这段代码,但我知道这段代码不正确,因为我没有得到一月、二月等的平均值。

normalspp=df[['CODE','PP']].groupby([df.CODE, df.index.month]).sum().round(1)

我只有 Python 的基本知识,所以如果您能帮助我,我将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:1)

第 2 版:按年-月和月平均

import pandas as pd
import numpy as np
x = pd.date_range(start='1/1/1991', end='12/31/2020',freq='D')
df = pd.DataFrame({'Date':x.tolist()*2,
                   'Code':['000130']*10958 + ['158328']*10958,
                   'TMAX': np.random.randint(6,10, size=21916),
                   'TMIN': np.random.randint(1,5, size=21916)
                  })

# Create a Month column to get Average by Month for all years

df['Month'] = df.Date.dt.month

# Create a Year-Month column to get Average of each Month within the Year

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

# Print the Average of each Month within each Year for each code

print (df.groupby(['Code','Year_Mon'])['TMAX'].mean())
print (df.groupby(['Code','Year_Mon'])['TMIN'].mean())

# Print the Average of each Month irrespective of the year (for each code)

print (df.groupby(['Code','Month'])['TMAX'].mean())
print (df.groupby(['Code','Month'])['TMAX'].mean())

如果要为 TMAX 平均值命名,可以添加 reset_index 和重命名列。这是执行此操作的代码。

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

输出结果为:

每个代码每个年-月的 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

每个代码每个年-月的 TMIN 平均值

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 平均值(所有年份的总和)

Code    Month
000130  1        7.540860
        2        7.536557
        3        7.482796
        4        7.486667
        5        7.444086
        6        7.570000
        7        7.507527
        8        7.529032
        9        7.501111
        10       7.401075
        11       7.482222
        12       7.517204
158328  1        7.532258
        2        7.563679
        3        7.490323
        4        7.555556
        5        7.500000
        6        7.497778
        7        7.545161
        8        7.483871
        9        7.526667
        10       7.529032
        11       7.547778
        12       7.524731
Name: TMAX, dtype: float64

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

Code    Month
000130  1        7.540860
        2        7.536557
        3        7.482796
        4        7.486667
        5        7.444086
        6        7.570000
        7        7.507527
        8        7.529032
        9        7.501111
        10       7.401075
        11       7.482222
        12       7.517204
158328  1        7.532258
        2        7.563679
        3        7.490323
        4        7.555556
        5        7.500000
        6        7.497778
        7        7.545161
        8        7.483871
        9        7.526667
        10       7.529032
        11       7.547778
        12       7.524731
Name: TMAX, dtype: float64

Ver 1:每个代码的年月平均值

这是一种方法。

您可以创建两列 - 年和月。然后通过执行 groupby ('Code','Year_Mon')

获得一年内每个月的 TMAX、TMIN 和 PP 的平均值

查看代码了解更多详情。

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

如果您只需要 Code、Year-Month 以及 TMIN 和 TMAX 值,您可以:

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

print (df.groupby(['Code','Year_Mon'])['TMAX'].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

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

print (df.groupby(['Code','Year_Mon'])['TMIN'].mean())

输出将是:

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