如何计算bash中netcdf文件中随时间维度求和的缺失值数量

Adr*_*ins 6 bash netcdf missing-data nco cdo-climate

我有一个 netcdf 文件,其中的数据是 lon、lat 和 time 的函数。我想计算在时间维度上求和的每个网格单元中缺失条目的总数,最好使用 CDO 或 NCO,因此我不需要调用 R、python 等。

我知道如何获得缺失值的总数

ncap2 -s "nmiss=var.number_miss()" in.nc out.nc
Run Code Online (Sandbox Code Playgroud)

正如我对这个相关问题的回答: count number of missing values in netcdf file - R

并且 CDO 可以告诉我空间总和

cdo info in.nc
Run Code Online (Sandbox Code Playgroud)

但我不知道如何随着时间的推移求和。例如,有没有一种方法可以指定要在 ncap2 中使用 number_miss 求和的维度?

Cha*_*der 2

从 NCO 4.6.7(2017 年 5 月)开始,我们向 ncap2 添加了 Missing() 函数来优雅地解决这个问题。要计算随时间变化的缺失值:

ncap2 -s 'mss_val=three_dmn_var_dbl.missing().ttl($time)' in.nc out.nc
Run Code Online (Sandbox Code Playgroud)

这里 ncap2 将两个方法链接在一起,missing(),后跟时间维度上的总计。2D 变量 mss_val 位于 out.nc 中。下面的响应做了同样的事情,但是在空间上进行平均并在时间上进行报告(因为我误解了OP)。

旧的/过时的答案:

使用 NCO/ncap2 有两种方法可以做到这一点,尽管两种方法都没有我想要的那么优雅。要么通过一次调用一条记录来调用 num_miss() 来一次一条记录地组装答案,或者(我的偏好)使用布尔比较函数,后跟沿着选择的轴的总计运算符:

zender@aerosol:~$ ncap2 -O -s 'tmp=three_dmn_var_dbl;mss_val=tmp.get_miss();tmp.delete_miss();tmp_bool=(tmp==mss_val);tmp_bool_ttl=tmp_bool.ttl($lon,$lat);print(tmp_bool_ttl);' ~/nco/data/in.nc ~/foo.nc
tmp_bool_ttl[0]=0 
tmp_bool_ttl[1]=0 
tmp_bool_ttl[2]=0 
tmp_bool_ttl[3]=8 
tmp_bool_ttl[4]=0 
tmp_bool_ttl[5]=0 
tmp_bool_ttl[6]=0 
tmp_bool_ttl[7]=1 
tmp_bool_ttl[8]=0 
tmp_bool_ttl[9]=2
Run Code Online (Sandbox Code Playgroud)

或者

zender@aerosol:~$ ncap2 -O -s 'for(rec=0;rec<time.size();rec++){nmiss=three_dmn_var_int(rec,:,:).number_miss();print(nmiss);}' ~/nco/data/in.nc ~/foo.nc
nmiss = 0 

nmiss = 0 

nmiss = 8 

nmiss = 0 

nmiss = 0 

nmiss = 1 

nmiss = 0 

nmiss = 2 

nmiss = 1 

nmiss = 2 
Run Code Online (Sandbox Code Playgroud)