将hdf5文件加载到python xarrays中

问题描述 投票:1回答:1

python模块xarray非常支持加载/映射netCDF文件,甚至懒惰地使用dask。

我必须使用的数据源是数千个hdf5文件,包含许多组,数据集和属性 - 所有这些都是使用h5py创建的。

问题是:如何将hdf5数据(数据集,元数据......)加载(甚至更好地使用dask,lazily map)到xarray数据集结构中?

有没有人遇到过这个问题或遇到类似的问题?谢谢!

python hdf5 dask h5py python-xarray
1个回答
1
投票

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

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

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

之后你可以利用xarray.backends.NetCDF4DataStore打开想要的hdf5组(xarray一次只能获得一个hdf5组):

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

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

解码数据没有(真正的)自动化,因为这可以用于NetCDF文件。如果你有一个整数压缩2d变量(数据集)var与一些属性gainoffset你可以添加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)

参考文献:

© www.soinside.com 2019 - 2024. All rights reserved.