【问题标题】:Calculating 30 year climate normal from gridded dataset in Python从 Python 中的网格数据集计算 30 年气候平均值
【发布时间】:2020-10-12 12:02:17
【问题描述】:

我正在尝试计算下面链接的 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 年

【问题讨论】:

  • 尝试在字典中读取多个一年文件,其中年份为键,对应的Dataset 为值。然后试着看看你是否能弄清楚如何平均。如果您仍然需要帮助,则需要详细说明Dataset 的结构,例如,如何在给定的纬度/经度坐标查找给定日期的温度。
  • 分析气候数据的最佳方法是使用特殊的运算符,如 CDONCONCL 等。我鼓励您在继续使用 Python 之前探索它们,但您可以尝试探索 Xarray 中的 resample 函数。另外,试试 CDO 中的ydaymean 函数,看看它是否能回答您的问题。它基本上计算多年的每日平均值。

标签: python numpy netcdf weather noaa


【解决方案1】:

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

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

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

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

import nctoolkit as nc
nc.options(lazy = True)
mean_30 = nc.open_data(ff_list)
mean_30.merge_time()
mean_30.cdo_command("del29feb")
mean_30.daily_mean_climatology()
mean_30.release()

然后你会从每日数据中减去这个来得到异常值。

anom_30 = nc.open_data(ff_list)
anom_30.cdo_command("del29feb")
anom_30.sub(mean_30)
anom_30.release()

这应该有异常

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

【讨论】:

猜你喜欢
  • 2020-04-29
  • 2018-07-01
  • 1970-01-01
  • 2023-04-07
  • 2017-01-18
  • 1970-01-01
  • 2014-10-22
  • 2018-08-08
  • 1970-01-01
相关资源
最近更新 更多