【问题标题】:How to calculate number of missing values summed over time dimension in a netcdf file in bash如何计算bash中netcdf文件中随时间维度求和的缺失值数量
【发布时间】:2017-10-09 16:44:19
【问题描述】:

我有一个 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 相加的维度?

【问题讨论】:

    标签: bash missing-data netcdf nco cdo-climate


    【解决方案1】:

    从 NCO 4.6.7(2017 年 5 月)开始,我们将 missing() 函数添加到 ncap2 以优雅地解决这个问题。通过时间计算缺失值:

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

    这里 ncap2 将两个方法链接在一起,missing(),然后是时间维度上的总和。二维变量 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 
    

    【讨论】:

    • 谢谢,赞成,因为它允许我从命令行看到答案,但我希望在 2D netcdf 文件中得到答案。我想向 nco 添加超切片功能,例如ncap2 -s "nmiss=var.number_miss(x,:,:) 可能很复杂吧?我对ncap2不是很熟悉。
    • 我们已经实现并使用了与您建议的类似的语法(例如,avg=var.avg($lat,$lon)),仅用于平均值、最大/最小值等。我不'不知道为什么我们没有为 number_miss() 实现它。既然你问了,我们会把它放在 TODO 列表中:)
    • 从未跟进说感谢您实施此功能,多年来一直非常有用,现在再次使用它。
    【解决方案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()
    

    【讨论】:

    • 是的,它在 python 中很简洁,赞成答案,我认为我可能不得不在 python 中这样做,我总是可以将字段写回我想的 netcdf
    • 我添加了一段代码,向您展示如何保存到 netcdf。
    • Chiel,我喜欢你的回答,而且它简洁而整洁,但我将接受的答案切换为更新的 NCO 解决方案,因为它允许我从命令行进行操作。两个答案都很好。
    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2013-12-11
    相关资源
    最近更新 更多