使用 NCO/CDO 或 bash 提取满足多个条件的日期

Extracting dates that satisfied multiple conditions using NCO/CDO or bash

我有一个包含涡度(每秒)和风(m/s)的 netcdf 文件。我想打印满足以下条件的网格点的日期:

1).涡度 > 1x10^-5 每秒和风 >= 5 m/s 在网格点。

2).在 (1) 中找到的网格点周围的“四个”(北、西、东、南)的涡度和风的平均值也应分别 > 1x10^-5 和 5m/s。

我可以使用 ncap 过滤满足 (1) 的网格点:

ncap2 -v -O -s 'where(vort > 1e-5 && winds >= 5) vort=vort; elsewhere vort=vort.get_miss();' input_test.nc output_test.nc

如何获取日期?还有我怎样才能实现第二个条件。

这里是 netcdf 文件 header 的截图。

我将不胜感激。

这可以通过组合“cdo”和“nco”来实现。

第二个条件所需要的周围4个格子的平均值可以通过结合"cdo"的shiftxyensmean运算符来计算。

cdo selname,vr,wspd input_test.nc vars.nc
cdo -expr,'vr_mean=vr; wspd_mean=wspd' \
      -ensmean \
        -shiftx,1  vars.nc \
        -shiftx,-1 vars.nc \
        -shifty,1  vars.nc \
        -shifty,-1 vars.nc \
    vars_mean.nc

然后,您可以使用“cdo”的 merge 运算符将检查条件 1) 和 2) 所需的变量组合到一个 NetCDF 文件中,并使用 ncap2 来检查您尝试过的条件。

在下面的示例命令中,“ncap2”的“for”循环用于扫描时间。如果每次至少有一个格子同时满足条件1)和2),则显示该时间的信息。

cdo merge vars.nc vars_mean.nc vars_test.nc
ncap2 -s '*flag = (vr > 1e-5 && wspd >= 5) && (vr > 1e-5 && wspd >= 5); *nt=$time.size; for(*i=0;i<nt;i++) { if ( max(flag(i,:,:))==1 ) { print(time(i)); } }' vars_test.nc