3

我想替换所有的 -999.0 值。netCDF 文件由 0.0. 文件在这里: https ://www.dropbox.com/s/ohh7tntzm2pj1uw/all_SSP3_BaU_NoCC.nc?dl=0

这是我的功能:

def modify_nc_value(path_inp, name_var, val_to_modify, new_value):
    """
    Replace value in netCDF vriable from val_to_modify to new_value
    Args:
        path_inp:
        name_var: Name of variable for which to modify value, if -1, then change all variables
        val_to_modify:
        new_value:

    Returns:

    """
    hndl_inp = netCDF4.Dataset(path_inp, 'r+')

    if name_var == -1:
        for var, varin in hndl_inp.variables.iteritems():
            hndl_inp[var][:][hndl_inp[var][:] == val_to_modify] = new_value
    else:
        hndl_inp[name_var][:][hndl_inp[name_var][:] == val_to_modify] = new_value

    hndl_inp.close()  # Write variable back to disk

但是,该功能似乎不起作用。没有 -999.0 值被替换。如何解决这个问题?

4

2 回答 2

3

您以附加模式 ( ) 打开文件r+,这将只允许添加新值。确实没有读/写模式,因为数据集增长很快。你有两个选择:

  • 读取数据集,打开一个新文件(模式为w,clobber 为 True),写入并修改,将其复制回原始数据集。

  • 如果数据集很大,意味着 > 5T 左右,你真的想修改你的代码来寻找 -999.0 值。

  • 可能有办法做到这一点。我从来没有做过这些提示,但你可能会有更好的运气。

祝你好运!如果您使它起作用,请将其添加到这些答案中。

于 2016-07-15T02:07:28.877 回答
1

如果您乐于考虑从命令行执行此任务,使用气候数据操作员(CDO)很容易实现

您可以定义一个具有 0 的掩码,其中原始字段具有 -999,然后将此掩码与原始字段相乘。

cdo nec,-999.0 file.nc mask.nc
cdo mul file.nc mask.nc new_file.nc 

或通过管道连接在一起

cdo mul file.nc -nec,-999.0 file.nc new_file.nc 

但是,我假设 -999.0 实际上是元数据中标识的字段的“缺失值”。在这种情况下,您也可以使用

cdo setmissval,0 file.nc new_file.nc

变量的文件内容在两种情况下都是相同的,但不同之处在于后一个命令还将更改元数据以将零标识为“缺失值”。这意味着 0 在 ncview 等软件中被正确识别为缺失。但是,请注意,现在丢失了任何零发生率,包括原始文件中已经存在的那些!

于 2020-04-29T08:05:06.540 回答