【问题标题】:Extracting data from netCDF by python通过python从netCDF中提取数据
【发布时间】:2018-01-16 20:26:02
【问题描述】:

我是使用 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)

任何建议将不胜感激。 谢谢。

【问题讨论】:

    标签: python netcdf netcdf4


    【解决方案1】:

    您首先需要知道时间/空间变化变量中维度的顺序,例如u10,您可以通过以下方式获得:

    u10 = jan.variables['u10']
    print(u10.dimensions)
    

    接下来是正确切片/索引数组的问题。如果您想要latitude=30longitude = 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 值。

    【讨论】:

    • 非常感谢。很合适。
    【解决方案2】:

    您好,我在来自 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
    

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2021-08-02
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2022-07-16
      相关资源
      最近更新 更多