使用气候数据运营商 (CDO) 从每日数据中得出的每月潮湿天数总和

Monthly sum of wet days from daily data using Climate Data Operators (CDO)

我有每日时间分辨率的气候数据,想按月和按年计算有降水(例如,大于 1 毫米/天)的天数。

我已经尝试了 eca_pd,1eca_rr1,但是这些命令 return 所有年份的雨天总数。

例如,cdo eca_pd,1 infile outfile

是否有 return 每个月 and/or 年的雨天的命令?

使用 NCO 的 ncap2,创建一个二进制标志,然后将其总计到所需的维度:

ncap2 -s 'rainy=(precip > 1);rainy_days=rainy.total($time)' in.nc out.nc

你可以通过CDO的masking功能来完成这个任务,除了下面的答案之外的更多细节,你也可以参考我的video guide on masking using cdo

第一步是创建一个等效文件,如果 P>threshold 为 1(在您的情况下为 1mm/day),否则为 0。为此,我们使用“大于或等于常数”gec 函数(或 ge="greater than",如果您愿意):

cdo gec,1 input.nc mask.nc 

(假设输入文件中的单位是 mm/day)。

然后您可以简单地在您想要统计的时​​间段(月、年等)内对这个掩码求和

cdo monsum mask.nc nwetdays_mon.nc 
cdo yearsum mask.nc nwetdays_year.nc

当然,如果您想在一行中执行此操作,则可以通过管道传输:例如

cdo monsum -gec,1 input.nc nwetdays_mon.nc 

如果您想计算出特定月份的气候,我们可以更进一步。如果您有多年数据集,那么您可以使用很棒的“ymonstat”命令。因此,例如,一旦您计算了上面每月的雨天系列,您就可以计算每个月的平均值

cdo ymonmean nwetdays_mon.nc nwetdays_mon_clim.nc

然后您可以将该系列与该月度气候学区分开来,以得出该系列中每个月潮湿天数的异常情况

cdo ymonsub nwetdays_mon.nc nwetdays_mon_clim.nc nwetdays_mon_anom.nc

我希望帮助ps!

(ps:我通常总是发现以这种方式直接用 CDO 计算这些类型的统计数据更容易,我很少发现内置的气候函数计算 exactly我想要的统计数据as/how)。

您也可以在 cf-python, essentially using the same methodology as the CDO example above, but in a Python environment, using the where and collapse 方法中执行此操作:

import cf

# Read the dataset
f = cf.read('filename.nc')[0]

# Mask out dry days (assuming that your data
#                    units are 'mm day-1' or 'kg m-2 day-1', etc.)
wet = f.where(cf.le(1), cf.masked)

# If the data are in units of 'metres/day', say, then you could do:
#   wet = f.where(cf.le(0.001), cf.masked)
# or
#   wet = f.where(cf.le(1, 'mm day-1'), cf.masked)
# etc.

# Count the wet day occurrences by month
count_monthly = wet.collapse('T: sample_size', group=cf.M())

# Count the wet day occurrences by year
count_yearly = wet.collapse('T: sample_size', group=cf.Y())

# Get the data as numpy arrays
print(count_monthly.array)
print(count_yearly.array)


# Count the wet day totals by month
wet_day_sum_monthly = wet.collapse('T: sum', group=cf.M())

# Count the wet day totals by year
wet_day_sum_yearly = wet.collapse('T: sum', group=cf.Y())