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

时间:2016-03-01 12:27:48

标签: 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_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代替不会改变任何内容。

指出错误的指示?

1 个答案:

答案 0 :(得分:1)

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

问题在于,在netCDF文件中使用打包数据并结合valid_minvalid_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