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

netCDF4 python生成的文件在Panoply中显示不佳,python,visualization,netcdf,Python,Visualization,Netcdf,我正在为变量和属性创建带有预定义数据类型的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_pi

我正在为变量和属性创建带有预定义数据类型的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奇怪地显示出来:

i、 e.许多值显示为
NaN
或大于
有效值_max
,它们不是通过构造得到的。应该是这样的:

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()

如果省略了
valid\u max
的定义,或者
valid\u max
设置为浮点数据类型,则Panoply会正确显示数据。使用
valid\u range
不会改变任何东西


有什么地方出了问题吗

您的代码生成介于30和4860之间的随机数据值,但由于您指定了
比例因子
添加偏移量
,这些值将存储为压缩数据。因此,在这种情况下,写入文件的值将是263[=(30-7.61)/0.085006105]和57082[=(4860-7.61)/0.085006105]之间的
int
s

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

见:


是:
netCDF4
模块自动打包值。谢谢