Одним из возможных решений этой проблемы является открытие hdf5-файла с использованием netCDF4 в режиме без диска:
ncf = netCDF4.Dataset(hdf5file, diskless=True, persist=False)
Теперь вы можете просматривать содержимое файла, включая groups
.
* 1006.* После этого вы можете использовать
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
с некоторыми атрибутами 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)
Ссылки: