将hdf5文件加载到python xarrays中

时间:2019-02-11 11:15:14

标签: python hdf5 dask h5py python-xarray

python模块xarray极大地支持了netCDF文件的加载/映射,即使懒惰也是如此。

我需要使用的数据源是成千上万的hdf5文件,其中包含许多组,数据集和属性-都是使用h5py创建的。

问题是:如何将hdf5数据(数据集,元数据...)加载(或更好地使用dask,懒惰地映射)到xarray数据集结构中?

有人对此有经验还是遇到过类似的问题? 谢谢!

1 个答案:

答案 0 :(得分:0)

一个可能的解决方案是在无磁盘非持久性模式下使用netCDF4打开hdf5-文件:

ncf = netCDF4.Dataset(hdf5file, diskless=True, persist=False)

现在您可以检查文件内容,包括groups

之后,您可以使用xarray.backends.NetCDF4DataStore打开所需的hdf5-group(xarray一次只能容纳一个hdf5-group):

nch = ncf.groups.get('hdf5-name')
xds = xarray.open_dataset(xarray.backends.NetCDF4DataStore(nch))

这将为您提供一个数据集xds,其中包含该数据集的所有属性和变量(数据集) 组hdf5-name。请注意,您将无法访问子组。您将需要通过相同的机制声明子组。如果要应用dask,则需要在关键字chunking中添加所需的值。

没有(真正的)自动解码数据的功能,例如可以对NetCDF文件执行的操作。如果您具有带有某些属性vargain的整数压缩2d变量(数据集)offset,则可以将NetCDF特定属性scale_factoradd_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_0phony_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)

参考文献: