2016-03-01 52 views
1

我正在为变量和属性创建具有预定义数据类型的netCDF文件,而我正在使用netCDF4和python。netCDF4-python生成的文件在Panoply中显示不佳

我的小例子,看起来是这样的:

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

而我的问题是:是通过一整套的古怪显示此脚本创建的文件:

Erroneous plot by Panoply

即多值显示为好像是NaN或大于valid_max,它们不是通过构建。它更应是这样的:

Correct plot by Panoply

一整套正确显示数据,如果我离开了的valid_max定义,或者如果valid_max设置为一个浮点数据类型。改用valid_range不会改变任何东西。

任何指向什么是错误的指针?

回答

1

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

问题的症结在于,在netCDF文件中使用打包数据以及valid_minvalid_max规范时的惯例是min和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

+0

是:在'netCDF4'模块自动完成值的包装。谢谢! – K4r1m

相关问题