latcd子集的netcdf4提取

use*_*827 5 python netcdf nco cdo-climate

我想提取一个相当大的netcdf文件的空间子集.从Loop到netcdf文件并运行计算 - Python或R.

from pylab import *
import netCDF4

f = netCDF4.MFDataset('/usgs/data2/rsignell/models/ncep/narr/air.2m.1989.nc')
# print variables
f.variables.keys()
atemp = f.variables['air'] # TODO: extract spatial subset
Run Code Online (Sandbox Code Playgroud)

如何仅提取对应于状态(例如爱荷华州)的netcdf文件的子集.爱荷华州有以下边界拉特隆:

经度:89°5'W至96°31'W

纬度:40°36'N至43°30'N

Fav*_*avo 13

这很容易,您必须找到纬度和经度上下限的索引.你可以通过找到最接近你正在寻找的值来做到这一点.

latbounds = [ 40 , 43 ]
lonbounds = [ -96 , -89 ] # degrees east ? 
lats = f.variables['latitude'][:] 
lons = f.variables['longitude'][:]

# latitude lower and upper index
latli = np.argmin( np.abs( lats - latbounds[0] ) )
latui = np.argmin( np.abs( lats - latbounds[1] ) ) 

# longitude lower and upper index
lonli = np.argmin( np.abs( lons - lonbounds[0] ) )
lonui = np.argmin( np.abs( lons - lonbounds[1] ) )  
Run Code Online (Sandbox Code Playgroud)

然后只是变量数组的子集.

# Air (time, latitude, longitude) 
airSubset = f.variables['air'][ : , latli:latui , lonli:lonui ] 
Run Code Online (Sandbox Code Playgroud)
  • 注意,我假设经度维度变量是东经度,空气变量有时间,纬度,经度维度.

  • 使用netcdf4-python库最直接的方法是创建一个新的netcdf文件,添加维度,变量名称,其属性以及保存数据数组.那是大约4~5行代码.另一个好的python库是IRIS(http://scitools.org.uk/iris),它有很好的方法来绘制,插入,重新编译和保存netcdf文件的子集. (2认同)

Spe*_*ill 12

Favo的答案有效(我假设;没有检查过).更直接的和惯用的方法是使用numpy的是其中功能找到所需的索引.

lats = f.variables['latitude'][:] 
lons = f.variables['longitude'][:]
lat_bnds, lon_bnds = [40, 43], [-96, -89]

lat_inds = np.where((lats > lat_bnds[0]) & (lats < lat_bnds[1]))
lon_inds = np.where((lons > lon_bnds[0]) & (lons < lon_bnds[1]))

air_subset = f.variables['air'][:,lat_inds,lon_inds]
Run Code Online (Sandbox Code Playgroud)

  • 使用此注释,我收到以下错误 IndexError: Index cannot be multidimensional 这可以通过向以 lat_inds 和 lon_inds 开头的行添加 [0] 来解决。 (2认同)

jsi*_*ell 5

如果您喜欢熊猫,那么您应该考虑签出xarray。

import xarray as xr

ds = xr.open_dataset('http://geoport.whoi.edu/thredds/dodsC/usgs/data2/rsignell/models/ncep/narr/air.2m.1980.nc',
                     decode_cf=False)
lat_bnds, lon_bnds = [40, 43], [-96, -89]
ds.sel(lat=slice(*lat_bnds), lon=slice(*lon_bnds))
Run Code Online (Sandbox Code Playgroud)

  • ds.where 将只是 [掩码](http://xarray.pydata.org/en/stable/indexing.html#masking-with-where),我建议`ds.sel(lat=slice(*lat_bnds) , lon=slice(*lon_bnds))` 代替。 (2认同)