我是使用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)
任何建议都将不胜感激。 谢谢。
答案 0 :(得分:3)
您首先需要知道时间/空间变化变量中维度的顺序,例如: 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
值。
答案 1 :(得分:-1)
您好我在来自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