我正在为变量和属性创建具有预定义数据类型的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奇怪地显示了这个脚本创建的文件:
即。许多值显示为NaN
或大于valid_max
,它们不是构造的。它应该是这样的:
如果忽略valid_max
的定义,或者valid_max
设置为浮点数据类型,则Panoply会正确显示数据。使用valid_range
代替不会改变任何内容。
指出错误的指示?
答案 0 :(得分:1)
您的代码生成30到4860之间的随机数据值,但由于您指定了scale_factor
和add_offset
,因此这些值将存储为打包数据。因此,在这种情况下,写入文件的值将是int
s在263 [=(30 - 7.61)/ 0.085006105]和57082 [=(4860 - 7.61)/ 0.085006105]之间。
问题在于,在netCDF文件中使用打包数据并结合valid_min
和valid_max
规范时的约定是必须根据打包值指定min和max比解压缩的值。由于您指定的valid_max为8190,因此当软件按照标准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