Я испытываю некоторые действительно странные взаимодействия между h5py, PyTables (через Pandas) и С++ сгенерированный HDF5. Кажется, что h5check и h5py, похоже, справляются с именами типов, содержащими '/', но Pandas/PyTables не может. Ясно, что в моем понимании есть пробел, поэтому:
Что я здесь не понял?
Детали gory
У меня есть следующие данные в файле HDF5:
[...]
DATASET "log" {
DATATYPE H5T_COMPOUND {
H5T_COMPOUND {
H5T_STD_U32LE "sec";
H5T_STD_U32LE "usec";
} "time";
H5T_IEEE_F32LE "CIF/align/aft_port_end/extend_pressure";
[...]
Это было создано через С++ API. Утилита h5check говорит, что файл действителен.
Обратите внимание, что CIF/align/aft_port_end/extend_pressure
не означает путь к группе /node/leaf. Это метка, которую мы используем внутри, которая имеет внутреннюю структуру, которая содержит "/" в качестве разделителей. Мы не хотим, чтобы файл HDF5 знал об этом: ему все равно. Ясно, что если '/' являются незаконными в любом имени HDF5, тогда мы должны изменить этот разделитель на что-то еще.
Использование PyTables (хорошо, Pandas, но использует PyTables внутренне), чтобы прочитать файл, я получаю
>>> import pandas as pd
>>> store = pd.HDFStore('data/XXX-20150423-071618.h5')
>>> store
/home/XXX/virt/env/develop/lib/python2.7/site-packages/tables/group. py:1156: UserWarning: problems loading leaf ``/log``::
the ``/`` character is not allowed in object names: 'XXX/align/aft_port_end/extend_pressure'
The leaf will become an ``UnImplemented`` node.
Я спросил об этом в этом вопросе и сказал, что '/' незаконно в спецификации. Тем не менее, все становится страннее с h5py...
Используя h5py, чтобы прочитать файл, я получаю то, что хочу:
>>> f['/log'].dtype
>>> dtype([('time', [('sec', '<u4'), ('usec', '<u4')]), ('CI
F/align/aft_port_end/extend_pressure', '<f4')[...]
Это более или менее то, что я изложил.
Нет нужды говорить, я смущен. Мне удалось создать незаконный h5check? Является PyTables, не поддерживающим этот случай края?... Я смущен.
Ясно, что я мог бы написать простую оболочку примерно так:
>>> import matplotlib.pyplot as plt
>>> silly = pd.DataFrame(f['/log']['CIF/align/aft_port_end/extend_pressure'])
>>> silly.plot()
>>> plt.show()
чтобы получить все данные из файла HDF5 в Pandas. Однако я не уверен, что это хорошая идея из-за путаницы раньше. Мое самое большое беспокойство заключается в том, что преобразование может не масштабироваться, если данные очень большие...