我想替换foll中的所有-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值被替换。如何解决这个问题?
答案 0 :(得分:2)
您以附加模式(r+
)打开文件,该模式仅允许添加新值。确实没有读/写模式,因为数据集快速增长。您有两种选择:
读取数据集,打开一个新文件(模式为w
,clobber为True),通过修改写入,将其复制回原始数据集。
如果数据集很大,则表示> 5T左右,你真的想修改你的代码来代替-999.0的值。
可能有办法做到这一点。我从未做过these hints,但你可能会有更好的运气。
答案 1 :(得分:1)
如果您很乐意考虑从命令行执行此任务,则使用climate data operators(CDO)即可轻松实现
您可以定义原始字段为-999的掩码为0,然后将该掩码与原始字段相乘。
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
该变量的文件内容在两种方式上是相同的,但是不同之处在于,后者的命令还将更改元数据以将零标识为“缺失值”。这意味着在ncview之类的软件中正确地将0标识为丢失。但是,请注意,现在缺少任何零出现率,包括原始文件中已经存在的那些!