Загрузка файлов hdf5 в Python Xarrays
Модуль Python xarray значительно поддерживает загрузку / отображение файлов netCDF, даже лениво с dask.
Источником данных, с которым мне приходится работать, являются тысячи файлов hdf5 с большим количеством групп, наборов данных, атрибутов - все они созданы с помощью h5py.
Вопрос: как я могу загрузить (или даже лучше с dask, lazily map) данные hdf5 (наборы данных, метаданные,...) в структуру набора данных xarray?
Кто-нибудь сталкивался с этим или сталкивался с подобной проблемой? Спасибо!
1 ответ
Одним из возможных решений этой проблемы является открытие hdf5-файла с использованием netCDF4 в бездисковом непостоянном режиме:
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
с некоторыми атрибутами 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)
Рекомендации: