使用具有单个时间片的掩码来掩码具有多个时间步长的另一个变量?

时间:2018-10-28 11:28:24

标签: netcdf nco cdo

我需要使用mask.nc中的陆海面具将变量屏蔽为var.nc文件

我正在使用NCO,如下所示:

ncks -h -A -v mask_var mask.nc var.nc
ncap2 -h -s 'where(mask_var!=1) var_to_mask= var_to_mask@_FillValue' IN.nc OUT.nc

问题在于定义变量的时间步长。特别是

mask_var(t,y,x) with t=1
var_to_mask(t,y,x,) with t=12

因此,第一个命令正确复制了t = 1的mask_var;因为t> 1 mask_var是NaN。

是否有其他方法可以复制mask_var?

谢谢

2 个答案:

答案 0 :(得分:2)

在NCO的ncap2中,where()条件中的变量等级必须与子句中变量的等级匹配。我认为这可以解释您所看到的行为,并且我认为可以通过以下方法解决此问题:首先创建与变量具有相同等级的掩码,然后使用该掩码:

ncks -h -A -v mask_var mask.nc var.nc
ncap2 -h -s 'big_mask_var=0*var_to_mask+mask_var;where(big_mask_var!=1) var_to_mask= var_to_mask@_FillValue' IN.nc OUT.nc

NB:可以将big_mask_var创建为不会出现在OUT.nc中的RAM变量。留给读者练习。

答案 1 :(得分:1)

我在NCO方面不是很好,但是我认为您也可以在CDO中轻松地做到这一点,并将以此为基础尝试其他方法。您没有在问题中明确说出确切的遮罩是什么以及如何遮罩,但是从代码中我可以推断出

  • 遮罩文件的浮动变量介于0和1之间
  • 您只想将变量值保留在mask = 1,并将其他所有内容都设置为missing(而不是零)?

如果是这种情况,那么您可以这样做:

cdo setrtomiss,-999,0.999 mask.nc maskmiss.nc
cdo mul maskmiss.nc var.nc varmasked.nc

第一行设置一个掩码,该掩码缺少0.999及以下的值,否则保持该值不变,第二行相乘。如果一个文件只有一个时间步长,则CDO会自动通过重复方式“填充”丢失的时隙,从而解决您的问题。如果您担心舍入(或蒙版的值大于1),则更安全的蒙版定义将是

cdo gec,1 mask.nc mask2.nc
cdo setctomiss,0 mask2.nc mask3.nc  
在这种情况下,如果原始掩码> = 1,则

mask2包含1,否则,则包含0,然后在第二步中将其映射为missing。

我认为您可以在一个命令中通过管道传递整个内容,并以此方式避免使用中间文件:

cdo mul -setctomiss,0 -gec,1 mask.nc var.nc varmasked.nc 

作为脚注的最后一件事,以防万一,您还可以使用内置的地形数据集在CDO中即时创建陆海面罩,这很容易,根据我在这里的回答:{{3 }}这很有用,因为有时您没有相同分辨率的遮罩数据集,并且可以节省精确地重新映射较粗比例遮罩的时间。