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显示的很奇怪:
即许多值显示为 NaN
或大于 valid_max
,它们不是构造出来的。它应该看起来像这样:
如果我省略 valid_max
的定义,或者如果 valid_max
设置为浮点数据类型,Panoply 会正确显示数据。使用 valid_range
不会改变任何东西。
有什么地方出了问题吗?
您的代码生成 30 到 4860 之间的随机数据值,但由于您指定了 scale_factor
和 add_offset
,这些值将存储为打包数据。因此,在这种情况下,写入文件的值将在 263 [= (30 - 7.61) / 0.085006105] 和 57082 [= (4860 - 7.61) / 0.085006105] 之间 int
s。
问题在于,在 netCDF 文件中结合 valid_min
和 valid_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
我正在为变量和属性创建具有预定义数据类型的 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
不会改变任何东西。
有什么地方出了问题吗?
您的代码生成 30 到 4860 之间的随机数据值,但由于您指定了 scale_factor
和 add_offset
,这些值将存储为打包数据。因此,在这种情况下,写入文件的值将在 263 [= (30 - 7.61) / 0.085006105] 和 57082 [= (4860 - 7.61) / 0.085006105] 之间 int
s。
问题在于,在 netCDF 文件中结合 valid_min
和 valid_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