Загрузка файлов 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)

Рекомендации:

Другие вопросы по тегам