根据 Python 中的网格化数据集计算 30 年气候正常值

Calculating 30 year climate normal from gridded dataset in Python

我正在尝试计算下面链接的 NARR 每日网格化数据集的 30 年正常温度(1981-2010 年平均值)。

最后,对于每个网格点,我想要一个包含 365 个值的数组,每个值都包含根据当天 30 年的数据计算出的当天平均温度。例如,每个网格点数组中的第一个值将是根据该网格点 1 月 1 日温度数据的 30 年(1981-2010)计算的 1 月 1 日平均温度。我的最终目标是能够使用这个新的 30yrNormal 数组来计算每日温度异常。

到目前为止,我只能根据一年的数据计算出异常值。这个问题是它取的是每日温度与全年平均值之间的差异,而不是每日温度与该日温度的 30 年平均值之间的差异:

file='air.sfc.2018.nc'
ncin = Dataset(file,'r')
#put data into numpy arrays
lons=ncin.variables['lon'][:]
lats=ncin.variables['lat'][:]
lats1=ncin.variables['lat'][:,0]
temp=ncin.variables['air'][:]
ncin.close()

AvgT=np.mean(temp[:,:,:],axis=0)
#compute anomalies by removing time-mean
T_anom=temp-AvgT

数据: ftp://ftp.cdc.noaa.gov/Datasets/NARR/Dailies/monolevel/ 1981-2010 年

使用 CDO 最容易解决这个问题。

如果您在 Linux 上使用 Python,则可以使用我的软件包 nctoolkit (https://nctoolkit.readthedocs.io/en/latest/ & https://pypi.org/project/nctoolkit/)。这使用 CDO 作为后端。

假设这30个文件是一个名为ff_list的列表。下面的代码应该可以工作。

首先,您将创建 30 年的每日平均气候学。

import nctoolkit as nc
mean_30 = nc.open_data(ff_list)
mean_30.merge_time()
mean_30.drop(month=2,day=29)
mean_30.tmean("day")
mean_30.run()

然后你可以从每天的数字中减去这个来得到异常值。

anom_30 = nc.open_data(ff_list)
anom_30.cdo_command("del29feb")
anom_30.subtract(mean_30)
anom_30.run()

这应该有异常

一个问题是文件是否有闰年,或者如果存在闰年你想如何处理。 CDO有一个未记录的命令-delfeb29,我在上面使用过