Загрузка файлов hdf5 в Python Xarrays - PullRequest
0 голосов
/ 11 февраля 2019

Модуль Python xarray значительно поддерживает загрузку / отображение файлов netCDF, даже лениво с dask.

Источником данных, с которым мне приходится работать, являются тысячи файлов hdf5, с множеством групп, наборов данных, атрибутов - всесоздан с помощью h5py.

Вопрос: : Как мне загрузить (или даже лучше с dask, lazily map) данные hdf5 (наборы данных, метаданные, ...) в структуру набора данных xarray?

Кто-нибудь сталкивался с этим или сталкивался с подобной проблемой?Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Одним из возможных решений этой проблемы является открытие 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)

Ссылки:

...