8

かなり大きな netcdf ファイルの空間サブセットを抽出したいと考えています。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

州 (アイオワ州など) に対応する netcdf ファイルのサブセットだけを抽出するにはどうすればよいですか。アイオワ州の境界緯度は次のとおりです。

経度: 89° 5' W ~ 96° 31' W

緯度: 40° 36' N ~ 43° 30' N

4

7 に答える 7

17

これは非常に簡単です。緯度と経度の上限と下限のインデックスを見つける必要があります。探している値に最も近い値を見つけることで、それを行うことができます。

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

次に、変数配列をサブセット化します。

# Air (time, latitude, longitude) 
airSubset = f.variables['air'][ : , latli:latui , lonli:lonui ] 
  • 経度の次元変数は東の角度であり、空気の変数には時間、緯度、経度の次元があることに注意してください。
于 2015-03-19T02:24:05.843 に答える
12

Favoの答えは機能します(私は推測します;チェックしていません)。より直接的で慣用的な方法は、numpy のwhere関数を使用して必要なインデックスを見つけることです。

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]
于 2015-03-19T14:47:04.993 に答える
4

これは、 NCO の ncksを使用して、コマンド ラインでさらに迅速に実行できることに注意してください。

ncks -v air -d latitude,40.,43. -d longitude,-89.,-96. infile.nc -O subset_infile.nc

于 2016-02-10T16:28:26.640 に答える
2

N1B4 からの応答をミラーリングするには、気候データ オペレーター (cdo) を使用して 1 行で行うこともできます。

cdo sellonlatbox,-96.5,-89,40,43 in.nc out.nc

したがって、一連のファイルをループするには、BASH スクリプトでこれを行い、cdo を使用して各ファイルを処理してから、Python スクリプトを呼び出します。

#!/bin/bash

# pick up a list of files (I'm presuming the loop is over the years)
files=`ls /usgs/data2/rsignell/models/ncep/narr/air.2m.*.nc`

for file in $files ; do 
   # extract the location, I haven't used your exact lat/lons
   cdo sellonlatbox,-96.5,-89,40,43 $file iowa.nc

   # Call your python or R script here to process file iowa.nc
   python script
done 

エラーが発生しにくいため、常に「オフライン」でファイル処理を行うようにしています。cdo は ncks の代替手段です。それが優れていると言っているわけではありません。コマンドを覚えるのが簡単だと思うだけです。一般に nco はより強力で、実行したいタスクを cdo で実行できない場合に使用します。

于 2017-01-10T10:18:33.043 に答える