我正在尝试从nc
文件中提取某些参数的值,但我的代码不适用于slp
参数,尽管它适用于其他参数。代码显示slp
的负值,这意味着导入数据不正确。
我用过这个脚本:
import numpy as np
import matplotlib as mpl
mpl.use('agg')
from mpl_toolkits.basemap import Basemap
from scipy.io import netcdf_file as nc
from pylab import *
from datetime import datetime
from datetime import timedelta
from glob import glob
files1 = glob('n1*nc')
files1.sort()
MVAL1 = -32767
for item in files1:
clf()
f1 = nc(item)
times=f1.variables['time']
lon = f1.variables['longitude'].data
lat = f1.variables['latitude'].data
slp = f1.variables['msl'].data
# to convert to hpa
slp = slp*0.01
dims = slp.shape
print slp.shape, np.max(slp), np.min(slp)
结果
(73, 121) 327.67 -327.66
当我在Panoply
中检查时,最小值和最大值不同。
如何解决这个问题?
答案 0 :(得分:2)
我怀疑Panoply会自动将scale_factor
和add_offset
属性应用于short
数据,并将结果显示为物理单位(Pa)中的浮点数。默认情况下,scipi.io
不会应用这些属性,因此您需要手动执行此操作:
slp = f1.variables['msl']
fslp = slp[:]*slp.scale_factor + slp.add_offset
在您的情况下,可能的数据范围约为-32766 *比例+偏移= 99081.Pa至32767 *比例+偏移= 101718. Pa。
对于更高级别的会议感知包(例如,Panoply,Ferret)来说,自动应用这些打包属性并且对于较低级别的接口(例如,Scipy.IO)将其留给用户是很常见的。您可以考虑使用NetCDF4 Python package代替,它会自动处理打包和填充值。