如何在Python NetCDF4模块中使用MFDataset读取OPeNDAP数据集的多个文件?

2 投票
1 回答
2511 浏览
提问于 2025-04-18 03:01

我有一个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

1 个回答

3

就像错误信息所说的,你不能在远程数据集上使用通配符(用*表示),但是你可以创建一个包含数据集网址的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合并在一起了。

撰写回答