netCDF4-python-生成的文件在 Panoply 中显示不佳

netCDF4-python-generated file poorly displayed in Panoply

我正在为变量和属性创建具有预定义数据类型的 netCDF 文件,为此我正在使用 netCDF4 和 python。

我的最小示例如下所示:

from netCDF4 import Dataset
import numpy as np

root_grp = Dataset("test_single_band.nc" ,'w',format = 'NETCDF4') 
data_grp = root_grp.createGroup("data") 
data_grp.createDimension("num_pixels", 3264) 
data_grp.createDimension("num_lines", None)

measurement_data_grp = data_grp.createGroup("measurement_data")
measurement_data_grp.createVariable("band", "u2",  \ 
("num_pixels","num_lines"), fill_value = np.uint16(8191)) 

measurement_data_grp["band"].long_name = "radiances"
measurement_data_grp["band"].units = "W m-2 sr-1 um-1"
measurement_data_grp["band"].scale_factor = np.float(0.085006105) 
measurement_data_grp["band"].add_offset = np.float(7.61) 
measurement_data_grp["band"].valid_min = np.uint16(0) 
measurement_data_grp["band"].valid_max = np.uint16(8190)

data_max = 4830.
data_min = 30.
data = data_max*np.random.random((3264,3800)) +  data_min

target = root_grp["data/measurement_data/band"]
target[:] = data.astype(target.dtype)

root_grp.close()

我的问题如下:用这个脚本创建的文件被Panoply显示的很奇怪:

Erroneous plot by Panoply

即许多值显示为 NaN 或大于 valid_max,它们不是构造出来的。它应该看起来像这样:

Correct plot by Panoply

如果我省略 valid_max 的定义,或者如果 valid_max 设置为浮点数据类型,Panoply 会正确显示数据。使用 valid_range 不会改变任何东西。

有什么地方出了问题吗?

您的代码生成 30 到 4860 之间的随机数据值,但由于您指定了 scale_factoradd_offset,这些值将存储为打包数据。因此,在这种情况下,写入文件的值将在 263 [= (30 - 7.61) / 0.085006105] 和 57082 [= (4860 - 7.61) / 0.085006105] 之间 ints。

问题在于,在 netCDF 文件中结合 valid_minvalid_max 规范使用打包数据时的惯例是,必须根据打包数据指定最小值和最大值值而不是解压缩的值。由于您指定了 8190 的 valid_max,因此在按照标准 netCDF 约定由软件解压缩时,任何打包为 8190 和 57082 之间的 int 的值都将被视为无效。

参见:

http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/build/ch08.html#packed-data

http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/build/ch02s05.html#missing-data