借助循环对气象数据进行汇总



我有一个120年的日降水量的气象数据集。我想以这样一种方式来准备这个,最后我有4个气候期的月平均值。示例:1月、2月、3月、…1981 - 2010年1月、2月、3月、…从2011年到2040年,等等。数据集如下所示(以csv文件的形式提供,以pandas dataframe的形式读取):

year  month  day  lon  lat      value
0      1981      1    1    0    0   0.522592
1      1981      1    2    0    0   2.692495
2      1981      1    3    0    0   0.556698
3      1981      1    4    0    0   0.000000
4      1981      1    5    0    0   0.000000
...     ...    ...  ...  ...  ...        ...
43824  2100     12   27    0    0   0.000000
43825  2100     12   28    0    0   0.185120
43826  2100     12   29    0    0  10.252080
43827  2100     12   30    0    0  13.389290
43828  2100     12   31    0    0   3.523566

这是我到现在为止的代码:

csv_path = r'filepath.csv'
df = pd.read_csv(csv_path, delimiter = ';')
df['date'] = pd.to_datetime(df[['year', 'month', 'day']])
years = pd.date_range('1981-01-01', periods = 6, freq = '30YS').strftime('%Y')
labels = [f'{a}-{b}' for a, b in zip(years, years[1:])]
(df.assign(period = pd.cut(df['year'], bins = years.astype(int), labels = labels, right = False)).groupby(df[['year', 'month']].dt.to_period('M')).agg({'period': 'first', 'value': 'sum'}).groupby('period')['value'].mean())

最好的方法可能是编写一个循环,迭代所有月份和4个30年的周期,但不幸的是,我无法做到这一点。有人有什么建议吗?预期的输出:

Month  Average
0  January       20
1  Febuary       21
2    March       19
3    April       18

要获得每月的总价值,然后是30年期间的平均值,您需要使用双groupby:

df['date'] = pd.to_datetime(df[['year', 'month', 'day']])
years = pd.date_range('1981-01-01', periods=6, freq='30YS').strftime('%Y')
labels = [f'{a}-{b}' for a,b in zip(years, years[1:])]
(df
.assign(period=pd.cut(df['year'], bins=years.astype(int), labels=labels, right=False))
.groupby(df['date'].dt.to_period('M')).agg({'period':'first', 'value': 'sum'})
.groupby('period')['value'].mean()
)

输出:

period
1981-2011     3.771785
2011-2041          NaN
2041-2071          NaN
2071-2101    27.350056
2101-2131          NaN
Name: value, dtype: float64

老回答

预期产出不完全清楚,但如果您想要每年每季度的平均降雨量:

df['date'] = pd.to_datetime(df[['year', 'month', 'day']])
df['quarter'] = df['date'].dt.to_period('Q')
df.groupby('quarter')['value'].mean()

输出:

quarter
1981Q1    0.754357
2100Q4    5.470011
Freq: Q-DEC, Name: value, dtype: float64

或全球每季度:

df['date'] = pd.to_datetime(df[['year', 'month', 'day']])
df['quarter'] = df['date'].dt.quarter
df.groupby('quarter')['value'].mean()

输出:

quarter
1    0.754357
4    5.470011
Name: value, dtype: float64

NB。其他时期也可以这样做。数月使用to_period('M')/.dt.month

df['date'] = pd.to_datetime(df[['year', 'month', 'day']])
df['period'] = df['date'].dt.to_period('M')
df.groupby('period')['value'].mean()

输出:

period
1981-01    0.754357
2100-12    5.470011
Freq: M, Name: value, dtype: float64

最新更新