将hdf5文件加载到Python xarrays中

11

Python模块xarray非常支持加载/映射netCDF文件,甚至可以使用dask进行懒加载。

我需要处理的数据源是成千上万个hdf5文件,其中有大量组、数据集和属性 - 所有这些都是使用h5py创建的。

问题是:如何将hdf5数据(数据集、元数据等)加载到xarray数据集结构中(最好使用dask进行懒映射)?

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


这是其中一个基本功能 - 你应该阅读文档,尝试使用并在此处报告任何问题。就目前而言,这不是一个真正的类似于SO的问题,你可能会看到负面投票。 - mdurant
@mdurant谢谢您的评论。我会尝试更清晰地表达我的问题。 - fmfreeze
我不熟悉 xarray 模块,但是 h5py 可以将 HDF5 数据作为 numpy 记录数组访问。因此,您只需将 hdf5 数据集作为记录数组访问,并将数据转换为 xarray 数据集格式即可。 - kcw78
1个回答

9
这个的一个可能解决方案是使用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 文件可以完成的那样。如果您有一个具有一些属性 gainoffset 的整数压缩 2D 变量(数据集)var,则可以向该变量添加 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)

参考文献:

1
这看起来是一个不错的方法,但是当我尝试打开我的hdf5文件时,我一直收到“AttributeError:'NoneType'对象没有属性'dimensions'”的错误。它是以与netcdf不兼容的方式编写的吗? - TomCho
1
@TomCho 你使用的xarray、hdf5、libnetcd和netCDF4版本是什么?还有代码和错误信息是什么? - kmuehlbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接