一种可能的解决方案是在无盘非持久模式下使用 netCDF4 打开 hdf5 文件:
ncf = netCDF4.Dataset(hdf5file, diskless=True, persist=False)
现在您可以检查文件内容,包括groups。
之后你可以利用xarray.backends.NetCDF4DataStore打开想要的hdf5-groups(xarray一次只能得到一个hdf5-group):
nch = ncf.groups.get('hdf5-name')
xds = xarray.open_dataset(xarray.backends.NetCDF4DataStore(nch))
这将为您提供一个数据集xds,其中包含所有属性和变量(数据集)
群组hdf5-name。请注意,您将无法访问子组。您需要通过相同的机制声明子组。如果您想申请dask,您需要添加关键字chunking 和想要的值。
对于 NetCDF 文件,解码数据没有(真正的)自动化。如果您有一个整数压缩二维变量(数据集)var 和一些属性 gain 和 offset,您可以将 NetCDF 特定属性 scale_factor 和 add_offset 添加到变量中:
var = xds['var']
var.attrs['scale_factor'] = var.attrs.get('gain')
var.attrs['add_offset'] = var.attrs.get('offset')
ds = xarray.decode_cf(xds)
这将使用 netcdf 机制解码您的变量。
此外,您可以尝试为提取的维度提供有用的名称(您会得到类似phony_dim_0、phony_dim_1、...、phony_dim_N)并将新的(如示例)或现有变量/坐标分配给这些维度以获得尽可能多的 xarray 机制:
var = xds['var']
var.attrs['scale_factor'] = var.attrs.get('gain')
var.attrs['add_offset'] = var.attrs.get('offset')
dims = var.dims
xds['var'] = var.rename({dims[0]: 'x', dims[1]: 'y'})
xds = xds.assign({'x': (['x'], xvals, xattrs)})
xds = xds.assign({'y': (['y'], yvals, yattrs)})
ds = xarray.decode_cf(xds)
参考文献: