使用 python 替换 netCDF 文件中的值
Replace values in netCDF file using python
我想替换下面所有的 -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
但是,该功能似乎不起作用。 None 的 -999.0 值被替换。如何解决这个问题?
您以追加模式打开文件 (r+
),这将只允许添加新值。确实没有 read/write 模式,因为数据集增长很快。您有两个选择:
读取数据集,打开一个新文件(mode为w
,clobber为True),修改后写入,复制回原始数据集。
如果数据集很大,即 > 5T 左右,您确实需要修改代码以查找 -999.0 值。
也许有办法。我没做过these hints,不过你运气可能会更好
祝你好运!如果您成功了,请将其添加到这些答案中。
如果您愿意考虑从命令行执行此任务,使用 climate data operators (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 实际上是元数据中标识的字段的 "missing value"。在这种情况下,您也可以使用
实现此目的
cdo setmissval,0 file.nc new_file.nc
变量的文件内容在这两种方式下都是相同的,但不同之处在于后一个命令还会更改元数据以将零标识为 "missing value"。这意味着 0 在 ncview 等软件中被正确识别为缺失。但是,请注意现在丢失了任何出现为零的情况,包括那些已经存在于原始文件中的情况!
我想替换下面所有的 -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
但是,该功能似乎不起作用。 None 的 -999.0 值被替换。如何解决这个问题?
您以追加模式打开文件 (r+
),这将只允许添加新值。确实没有 read/write 模式,因为数据集增长很快。您有两个选择:
读取数据集,打开一个新文件(mode为
w
,clobber为True),修改后写入,复制回原始数据集。如果数据集很大,即 > 5T 左右,您确实需要修改代码以查找 -999.0 值。
也许有办法。我没做过these hints,不过你运气可能会更好
祝你好运!如果您成功了,请将其添加到这些答案中。
如果您愿意考虑从命令行执行此任务,使用 climate data operators (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 实际上是元数据中标识的字段的 "missing value"。在这种情况下,您也可以使用
实现此目的cdo setmissval,0 file.nc new_file.nc
变量的文件内容在这两种方式下都是相同的,但不同之处在于后一个命令还会更改元数据以将零标识为 "missing value"。这意味着 0 在 ncview 等软件中被正确识别为缺失。但是,请注意现在丢失了任何出现为零的情况,包括那些已经存在于原始文件中的情况!