使用scipy从nc文件中提取数据

时间:2015-04-24 12:37:22

标签: python scipy netcdf

我正在尝试从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中检查时,最小值和最大值不同。

如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我怀疑Panoply会自动将scale_factoradd_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代替,它会自动处理打包和填充值。