将 hdf5 文件加载到 python xarrays
Loading hdf5 files into python xarrays
python 模块 xarray 极大地支持 loading/mapping netCDF 文件,甚至懒惰地使用 dask。
我必须使用的数据源是数以千计的 hdf5 文件,其中包含大量组、数据集、属性 - 全部使用 h5py 创建。
问题是:如何将 hdf5 数据(数据集、元数据...)加载到 xarray 数据集结构中?
有没有人有这方面的经验或遇到过类似的问题?
谢谢!
一个可能的解决方案是在无盘非持久模式下使用 netCDF4 打开 hdf5 文件:
ncf = netCDF4.Dataset(hdf5file, diskless=True, persist=False)
现在您可以检查文件内容,包括 groups
。
之后可以利用xarray.backends.NetCDF4DataStore
打开需要的hdf5-groups(xarray
一次只能打开一个hdf5-groups):
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
的名称)并分配新的(如示例)或现有 variables/coordinates 到这些维度以获得尽可能多的 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)
参考文献:
python 模块 xarray 极大地支持 loading/mapping netCDF 文件,甚至懒惰地使用 dask。
我必须使用的数据源是数以千计的 hdf5 文件,其中包含大量组、数据集、属性 - 全部使用 h5py 创建。
问题是:如何将 hdf5 数据(数据集、元数据...)加载到 xarray 数据集结构中?
有没有人有这方面的经验或遇到过类似的问题? 谢谢!
一个可能的解决方案是在无盘非持久模式下使用 netCDF4 打开 hdf5 文件:
ncf = netCDF4.Dataset(hdf5file, diskless=True, persist=False)
现在您可以检查文件内容,包括 groups
。
之后可以利用xarray.backends.NetCDF4DataStore
打开需要的hdf5-groups(xarray
一次只能打开一个hdf5-groups):
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
的名称)并分配新的(如示例)或现有 variables/coordinates 到这些维度以获得尽可能多的 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)
参考文献: