[英]Extracting data for a specific location from netCDF by python
我是 Python 的新手,也是 NetCDF 的新手,如果我不清楚,請深表歉意。 我有一個包含多個變量的 nc 文件,我需要以新順序從這些 nc 文件中提取數據。
我的 nc 文件有 8 個變量(經度、緯度、時間、u10、v10、swh、mwd、mwp),我正在嘗試的邏輯是“如果我輸入經度和緯度,我的程序會輸出其他變量(u10、v10、swh , mwd, mwp) 按時間排序。” 然后我會把提取的數據放在另一個數據庫中。
我測試了我的 nc 文件如下:
import netCDF4
from netCDF4 import Dataset
jan = Dataset('2016_01.nc')
print jan.variables.keys()
lon = jan.variables['longitude']
lat = jan.variables['latitude']
time = jan.variables['time']
for d in jan.dimensions.items():
print d
lon_array = lon[:]
lat_array = lat[:]
time_array = time[:]
print lon_array
print lat_array
print time_array
一些結果如下
[u'longitude', u'latitude', u'time', u'u10', u'v10', u'swh', u'mwd', u'mwp']
(u'longitude', <type 'netCDF4._netCDF4.Dimension'>: name = 'longitude', size = 1440)
(u'latitude', <type 'netCDF4._netCDF4.Dimension'>: name = 'latitude', size = 721)
(u'time', <type 'netCDF4._netCDF4.Dimension'> (unlimited): name = 'time', size = 186)
任何意見,將不勝感激。 謝謝你。
首先,您需要了解隨時間/空間變化的變量的維度順序,例如u10
,可以通過以下方式獲得:
u10 = jan.variables['u10']
print(u10.dimensions)
接下來是正確切片/索引數組的問題。 如果您想讓數據說latitude=30
, longitude = 10
,則可以使用(在將Numpy作為import numpy as np
之后)找到對應的(最近的)索引:
i = np.abs(lon_array - 10).argmin()
j = np.abs(lat_array - 30).argmin()
假設u10
的維度按{time, lat, lon}
排序,則可以按以下方式讀取數據:
u10_time = u10[:,j,i]
這將為您提供所需位置的所有(時變) u10
值。
這種任務使用xarray
很簡單,例如
import xarray as xr
lon=30
lat=10
# open the file, select the location and write to new netcdf
da=xr.open_dataset('2016_01.nc')
ts=da.sel(x=lon, y=lat, method="nearest")
ts.to_netcdf('timeseries.nc')
嗨,我在來自WRF的文件netCDF上使用了它。
import numpy as np
from netCDF4 import Dataset # http://code.google.com/p/netcdf4-python/
import pandas as pd
import os
os.chdir('.../netcdf') # Select your dir
f = Dataset('wrfout_d01_2007-01-01_10_00_00', 'r') #Charge your file
latbounds = [ 4.691417 ]# Latitud
lonbounds = [ -74.209 ]# Longitud
cor_lat = pd.DataFrame(f.variables['XLAT'][0][:])
cor_lat2 = pd.DataFrame({'a':cor_lat.iloc[:,0], 'b':abs(cor_lat.iloc[:,0] - latbounds)})
a = cor_lat2[cor_lat2.b == min(cor_lat2.b)].index.get_values()[0]
cor_lon = pd.DataFrame(f.variables['XLONG'][0][:])
cor_lon2 = pd.DataFrame({'a':cor_lon.iloc[0,:], 'b':abs(cor_lon.iloc[0,:] - lonbounds)})
b = cor_lon2[cor_lon2.b == min(cor_lon2.b)].index.get_values()[0]
vlr = (f.variables['T2'][ : , a , b ] - 273.15)[0] #This change from kelvin to celsius
vlr
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.