更改 netCDF 文件中的 _FillValue

Change _FillValue in netCDF file

是否有 python netCDF4 command/example 来更改 netCDF 文件中的全局元数据 _FillValue?我曾尝试替换 netCDF 文件中的所有 -ve 值,但在设置 _FillValue 属性之前,这不起作用

我不相信 python netCDF4 有这方面的特定功能,但 NCO's ncatted 是完成此任务的理想工具。

来自文档:

将缺失值从 IEEE NaN 值更改为普通 IEEE 数字,如 1.0e36:

ncatted -a _FillValue,,m,f,1.0e36 in.nc

您也可以使用 cdo 将缺失的条目设置为另一个值,例如 999.0

cdo setmisstoc,999.0 in.nc out.nc

但是,根据您的问题描述,您似乎实际上不需要更改 _Fillvalue 的值,而是希望将负值设置为缺失值。您可以通过使用 cdo 函数“set range to miss”

来实现这一点
cdo setrtomiss,-1e8,0 in.nc out.nc 

第一个参数是一个很大的负数,它小于数据集中的最小值。我在上面的答案中假设相关字段已经设置了值,否则您需要添加它,例如

cdo setattribute,field@_FillValue=-1.e32 infile outfile

一般来说,定义“全局”_FillValue 似乎会导致问题(例如,参见 https://github.com/Unidata/netcdf-c/issues/458),而且无论如何,如果您有整数和浮点字段的组合,则无法应用定义默认的浮点填充到所有领域。我个人认为,最好的做法是分别为每个字段定义一个填充值,并在可能的情况下为每种数据类型使用默认值。

可以使用 cdo 包直接从 python 调用 cdo 命令。

_FillValue 特定于变量。有了Python NetCDF4库,我明白只能在创建变量的时候指定。可以使用 CDO 更改 _FillValue。这就是我自己更改 _FillValue 的方式:

cdo -setattribute,Band1@_FillValue=-1.0 infile.nc outfile.nc