使用 CDO 计算 ERA5 每日总降水量

Calculating ERA5 Daily Total Precipitation using CDO

本质上,这是对这个问题的转发:https://confluence.ecmwf.int/pages/viewpage.action?pageId=149341027

我已经从CDS 下载了ERA5。对于从每个考虑年份的 1 月 1 日到 12 月 31 日开始的每个日历日,输入文件具有 24 小时步长(0、1、2、3、4、..、23)。

ECMWF 在这里声明 https://confluence.ecmwf.int/display/CKB/ERA5%3A+How+to+calculate+daily+total+precipitation 每日总降水量必须通过累积降水量来计算,例如Jan 1, 1979 通过将 1 月 1 日的第 1、2、...、23 步和 1 月 2 日的第 0 步求和。这意味着 1979 年 1 月 1 日的第 0 步不包括在计算当天的总降水量中.为了计算 1979 年 1 月 2 日的总降水量,我们还使用当天的第 1、2、3、...、23 步加上 1 月 3 日的第 0 步,依此类推。

在 python 中似乎有这样的选项:

import xarray as xr                                                    # import xarray library
ds_nc = xr.open_dataset('name_of_your_file.nc')                        # read the file
daily_precipitation = ds_nc.tp.resample(time='24H').sum('time')*1000   # calculate sum with frequency of 24h and multiply by 1000
daily_precipitation.to_netcdf('daily_prec.nc')                         # save as netCDF

现在我想知道这是否也可以通过简单的方式使用气候数据操作员 (CDO)。通常我会在 CDO 中使用 daysum 命令进行任何此类计算,但我不确定这是正确的。

有人建议使用:

cdo -f nc copy  out.nc aux.nc
cdo -delete,timestep=1, aux.nc aux1.nc
cdo -b 32 timselsum,24 aux1.nc aux2.nc
cdo -expr,'ppt=tp*1000' -setmissval,-9999.9 -remapbil,r240x120 aux2.nc era5_ppt_prev-0_1979-2018.nc

但我不确定这是否正确 - 有什么建议吗?

对于这类问题,CDO 中有用的命令是 shifttime,它基本上执行罐头上所说的并移动时间戳。

这种问题经常出现在分配给数据值的时间戳指向时间累积周期的END的任何类型的通量或累积字段中,或者"window",例如3小时的TRMM数据,一天的最后三个小时在之后日期的时间戳为00,直接应用daymean或daysum等函数会计算一天21小时的平均值和3前一天的小时数,不正确。在执行计算之前将时间戳移动三个小时,以便时间指向 window 的开始(或者实际上移动 1.5,指向中间)将解决此问题。

因此,对于您的特定问题,如果您有来自 ERA5 的一长串每小时数据并且您想要每日总数,您可以这样做:

cdo shifttime,-1hour in.nc shift.nc # now step 0 on Jan 2 has Jan 1, 23:00 stamp 
cdo daysum shift.nc daysum.nc 

或通过管道连接在一起:

cdo daysum -shifttime,-1hour in.nc daysum.nc

(注意:此过程与旧版 ERA-Interim 的通量用户不同,在旧版 ERA-Interim 中通量是通过短期预测期累积的。对于 ERA5,"deaccumulation" 已经为您完成。使用 ERA-Interim,您需要对连续时间步进行差分以从累积字段转换,这里有一个 post 显示如何使用 CDO 或 python 执行此操作: )

# Correction to above python example to account for the time shift, as in the CDO example. Input file always needs to have the following day to the last day for which you want to compute daily sums/averages
import xarray as xr
ds_nc = xr.open_dataset('name_of_your_file.nc')                     # read the file
sds= ds_nc.shift(time=-1).dropna(dim='time',how='all')              # shift to account for time shift for accumulated variables 

daily_precipitation = sds.tp.resample(time='24H').sum('time')*1000   # calculate sum     with frequency of 24h and multiply by 1000
# need to figure start_time and end_time for separately or slice differently. 
sdaily=daily_precipitation.sel(time=slice("<start_time>", "<end_time>)")    # drop the last value because values aren't complete.  

sdaily.to_netcdf('daily_prec.nc') 

如果你显示任意两天的ERA 5数据,你可以观察到1月2日0000的tp(假设)已经是过去24小时的累积降水量(从1月1日的0100到2400(02年的0000) 1 月)1 月 1 日)。所以你只需要选择时间步长 0000 的降水值。