如何计算bash中netcdf文件中时间维度相加的缺失值的数量

时间:2017-05-10 20:54:14

标签: bash missing-data netcdf nco

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

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

ncap2 -s "nmiss=var.number_miss()" in.nc out.nc

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

和CDO可以用

告诉我总空间总和
cdo info in.nc

但我无法弄清楚如何总结。有没有办法在ncap2中用number_miss指定要求的维度?

2 个答案:

答案 0 :(得分:2)

即使你要求另一个解决方案,我想告诉你,在Python的帮助下找到答案只需要很短的一行。变量m_data与使用netCDF4包读取缺失值的变量具有完全相同的形状。只执行一个np.sum命令并指定正确的轴,就可以得到答案。

import numpy as np
import matplotlib.pyplot as plt
import netCDF4 as nc4

# Generate random data for this experiment.
data = np.random.rand(365, 64, 128)

# Masked data, this is how the data is read from NetCDF by the netCDF4 package.
# For this example, I mask all values less than 0.1.
m_data = np.ma.masked_array(data, mask=data<0.1)

# It only takes one operation to find the answer.
n_values_missing = np.sum(m_data.mask, axis=0)

# Just a plot of the result.
plt.figure()
plt.pcolormesh(n_values_missing)
plt.colorbar()
plt.xlabel('lon')
plt.ylabel('lat')
plt.show()

# Save a netCDF file of the results.
f = nc4.Dataset('test.nc', 'w', format='NETCDF4')
f.createDimension('lon', 128)
f.createDimension('lat', 64 )
n_values_missing_nc = f.createVariable('n_values_missing', 'i4', ('lat', 'lon'))
n_values_missing_nc[:,:] = n_values_missing[:,:]
f.close()

答案 1 :(得分:1)

我们向ncap2添加了missing()函数,以便在NCO 4。6。7(2017年5月)中优雅地解决这个问题。要计算缺失值:

ncap2 -s 'mss_val=three_dmn_var_dbl.missing().ttl($time)' in.nc out.nc

这里ncap2将两个方法链接在一起,缺少(),然后是总时间维度。 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

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