Как использовать MFDataset для чтения нескольких файлов в наборе данных OPeNDAP с модулем Python NetCDF4?

У меня есть ссылка opendap thredds на каталог, содержащий множество выходных файлов океанографических моделей из Делавэрской операционной системы прогнозирования (DBOFS). Исторические данные хранятся в отдельных почасовых файлах и даже в некоторых файлах, охватывающих несколько часов. Я хотел бы смотреть на файлы, как если бы они были одним длинным временным рядом. Я наткнулся на другой вопрос, задающий нечто подобное здесь: Цикл netcdf и запускать расчеты — Python или R

Поиск с подстановочным знаком вернул следующую ошибку:

import netCDF4

f = netCDF4.MFDataset('http://opendap.co-ops.nos.noaa.gov/thredds/dodsC/NOAA/DBOFS/MODELS/201401/nos.dbofs.fields.n001.20140130.*.nc')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-a44e21cddbe9> in <module>()
----> 1 f = netCDF4.MFDataset('http://opendap.co-ops.nos.noaa.gov/thredds/dodsC/NOAA/DBOFS/MODELS/201401/nos.dbofs.fields.n001.20140130.*.nc')

C:\Users\cenglert\AppData\Local\Enthought\Canopy32\User\lib\site-packages\netCDF4.pyd in netCDF4.MFDataset.__init__ (netCDF4.c:6458)()

ValueError: cannot using file globbing for remote (OPeNDAP) datasets

person Chris Englert    schedule 16.04.2014    source источник


Ответы (1)


Как говорится в ошибке, вы не можете использовать подстановку (используя * в качестве подстановочного знака) для удаленных наборов данных, но вы можете создать список URL-адресов наборов данных в Python и передать их MFDataset. Так:

import netCDF4

base = 'http://opendap.co-ops.nos.noaa.gov/thredds/dodsC/\
NOAA/DBOFS/MODELS/201401/nos.dbofs.fields.n001.20140130.t%2.2dz.nc'
files = [base % d for d in range(0,24,6)]
nc = netCDF4.MFDataset(files)
print nc.variables['salt']

который производит:

<class 'netCDF4._Variable'>
float64 salt('ocean_time', 's_rho', 'eta_rho', 'xi_rho')
    long_name: salinity
    time: ocean_time
    coordinates: lat_rho lon_rho
    field: salinity, scalar, series
unlimited dimensions = ('ocean_time',)
current size = (4, 10, 732, 119)

и показывает, что на самом деле четыре значения в 0, 6, 12 и 18 часов были фактически объединены MFDataset.

person Rich Signell    schedule 16.04.2014
comment
То же самое относится и к xarray.open_mfdataset() - person jsignell; 18.05.2016