我正在尝试从 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
中检查它时,最小值和最大值是不同的。
如何解决这个问题?
最佳答案
我怀疑 Panoply 会自动将 scale_factor
和 add_offset
属性应用于 short
数据,并将结果以 float 形式呈现给您物理单位(Pa)。默认情况下,scipi.io
不应用这些属性,因此您需要手动执行此操作:
slp = f1.variables['msl']
fslp = slp[:]*slp.scale_factor + slp.add_offset
在您的情况下,数据的可能范围约为 -32766*scale + offset = 99081.Pa 到 32767*scale + offset = 101718.Pa。
较高级别的约定感知包(例如 Panoply、Ferret)自动应用这些打包属性,而较低级别的接口(interface)(例如 Scipy.IO)则将其留给用户,这是很常见的。您可以考虑使用 NetCDF4 Python package相反,它会自动处理打包和填充值。
关于python - 使用 scipy 从 nc 文件中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29847737/