Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中计算netcdf文件中随时间维度求和的缺失值数_Bash_Missing Data_Netcdf_Nco_Cdo Climate - Fatal编程技术网

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

如何在bash中计算netcdf文件中随时间维度求和的缺失值数,bash,missing-data,netcdf,nco,cdo-climate,Bash,Missing Data,Netcdf,Nco,Cdo Climate,我有一个netcdf文件,其中的数据是lon、lat和时间的函数。我想计算每个网格单元中在时间维度上求和的缺失条目的总数,最好使用CDO或NCO,这样我就不需要调用R、python等 我知道如何获取缺失值的总数 ncap2 -s "nmiss=var.number_miss()" in.nc out.nc 当我回答这个相关问题时: CDO可以告诉我,空间上的总和 cdo info in.nc 但我不知道如何随着时间的推移求和。例如,是否有一种方法可以在ncap2中指定要与数字_miss求和

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

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

ncap2 -s "nmiss=var.number_miss()" in.nc out.nc
当我回答这个相关问题时:

CDO可以告诉我,空间上的总和

cdo info in.nc

但我不知道如何随着时间的推移求和。例如,是否有一种方法可以在ncap2中指定要与数字_miss求和的维度?

即使您正在寻求另一种解决方案,我想告诉您,在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()
将numpy导入为np
将matplotlib.pyplot作为plt导入
将netCDF4导入为nc4
#为这个实验生成随机数据。
data=np.random.rand(365,64,128)
#屏蔽数据,这是netCDF4包从NetCDF读取数据的方式。
#对于本例,我屏蔽了所有小于0.1的值。
m_data=np.ma.masked_array(data,mask=data从NCO 4.6.7(2017年5月)开始,我们向ncap2添加了missing()函数,以优雅地解决此问题。要通过时间计算缺失值:

ncap2 -s 'mss_val=three_dmn_var_dbl.missing().ttl($time)' in.nc out.nc
这里,ncap2将两个方法链接在一起,missing(),然后是整个时间维度的总和。2D变量mss_val在out.nc中。下面的响应与此相同,但在空间上平均,并随时间报告(因为我误解了OP)

旧/过时答案:

使用NCO/ncap2有两种方法可以做到这一点,尽管这两种方法都没有我想要的那么优雅。要么通过调用num_miss()一次只调用一条记录来一次组装一条记录,要么(我喜欢)使用布尔比较函数,然后沿选择轴使用total运算符:

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'用于(rec=0;recYes,它在python中是简洁的,请投票赞成答案,我可能必须用python来做这件事我想,我总是可以将字段写回netcdf我想我添加了一段代码,告诉你如何保存到netcdf。Chiel,我喜欢你的答案,它紧凑而整洁,但我将公认的答案切换到更新的NCO解决方案,因为它是允许我从命令行执行此操作。两个答案都非常好。谢谢,upvote,因为它允许我从命令行查看答案,但我希望在2D netcdf文件中找到答案。我想向nco添加一个hyperslice功能,例如ncap2-s“nmiss=var.number_miss(x,:,:)可能很复杂吗?我对ncap2不太熟悉。我们已经实现并使用了与您建议的语法类似的语法(例如,avg=var.avg($lat,$lon)),仅用于平均值、最大/最小值等。我不知道为什么我们没有为number_miss()实现该语法。既然您提出了要求,我们将其放在待办事项列表中:)
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