使用python替换netCDF文件中的值

使用python替换netCDF文件中的值,python,netcdf4,cdo-climate,Python,Netcdf4,Cdo Climate,我想替换foll中的所有-999.0值。netCDF文件由0.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 va

我想替换foll中的所有-999.0值。netCDF文件由0.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值。如何修复此问题?

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

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

  • 如果数据集很大,意味着>5T左右,那么您确实希望修改代码以查找-999.0值

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


祝你好运!如果你让它工作,把它添加到这些答案中。

如果你乐意从命令行考虑这项任务,用(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)中被正确标识为缺失。但是,请注意,现在丢失了零的任何关联,包括原始文件中已经存在的关联

变量总是1D吗?我怀疑不是,但您的代码总是将
var
指定为1D,即
[var][:]
。变量是3D您不需要如中所述进行同步吗?我认为对于3D数组,NetCDF不允许多维索引(请参阅),但这才是您真正需要的。示例文件中唯一具有-999值的变量似乎是
c4ann
——这就是您所期望的吗?我注意到其他一些(例如,
c3ann
)有一个掩码,其中填充值为-999。也许你可以提供更多的背景,我们可以帮助你找到一种方法来得到你想要的。