Как правильно извлечь данные из файла .h5 и сохранить их в .txt или .csv?

После долгих поисков я не смог найти простой способ извлечь данные из .h5 и передать их в data.Frame с помощью Numpy или Pandas для сохранения в файле .txt или .csv.

import h5py
import numpy as np
import pandas as pd

filename = 'D:\data.h5'
f = h5py.File(filename, 'r')

# List all groups
print("Keys: %s" % f.keys())
a_group_key = list(f.keys())[0]

# Get the data
data = list(f[a_group_key])
pd.DataFrame(data).to_csv("hi.csv")
Keys: <KeysViewHDF5 ['dd48']>

Когда я печатаю данные, я вижу следующие результаты:

print(data)
['axis0',
 'axis1',
 'block0_items',
 'block0_values',
 'block1_items',
 'block1_values']

Я был бы признателен, если бы кто-нибудь объяснил мне, что это такое и как я могу полностью извлечь данные и сохранить их в файле .csv. Кажется, не было обычного способа сделать это, и это пока довольно сложно! До сих пор я просто мог видеть часть данных через:

import numpy as np 
dfm = np.fromfile('D:\data.h5', dtype=float)
print (dfm.shape)
print(dfm[5:])

dfm=pd.to_csv('train.csv')
#dfm.to_csv('hi.csv', sep=',', header=None, index=None)

Я ожидаю извлечь time_stamps и измерения в файл .h5.


person Mario    schedule 21.05.2019    source источник


Ответы (2)


Похоже, что эти данные были написаны Pandas, поэтому используйте pd.read_hdf(), чтобы прочитать его.

person John Zwinck    schedule 21.05.2019
comment
Привет, не работает смотри : reread = pd.read_hdf('D:\data.h5') и из-за ImportError: HDFStore requires PyTables, "No module named 'tables'" problem importing я обновил/установил pytables от pip install --upgrade tables но сейчас столкнулся с ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C header, got 192 from PyObject. У тебя есть идеи? - person Mario; 21.05.2019
comment
@Марио, вам может понадобиться обновленная или чистая установка pandas и/или numpy. Если h5 было написано с помощью pandas и pytables, его будет намного легче читать теми же инструментами. h5py — это интерфейс более низкого уровня для файлов, использующий только numpy массивы. Таким образом, он может прочитать файл, но создание фрейма данных из массивов будет более трудоемким и потребует больше знаний о внутренних компонентах панд. - person hpaulj; 21.05.2019
comment
@hpaulj Версия numpy, которую я использовал, — это 1.15.4, а по пункту — 1.16.3, а версия Pandas, которую я использовал, — это 0.23.4, а по пункту — 0.24.1, как видно здесь. Я не могу обновить его, так как он будет несовместим с Keras nad TF, но спасибо за внимание. - person Mario; 21.05.2019
comment
@Mario: вам просто нужно установить PyTables, возможно, используя тот же менеджер пакетов, который вы использовали для получения Pandas. - person John Zwinck; 22.05.2019
comment
Марио, вы можете прочитать файл HDF5 с помощью любого из упомянутых выше модулей Python (Pandas, PyTables или h5py). Я не использую Pandas, поэтому не могу помочь. Pytables также может извлекать наборы данных в массивы numpy. Если вы новичок в HDF5, я предлагаю установить HDFView из Группы HDF, чтобы увидеть данные и структуру внутри файла. ИМХО, видеть ваши данные очень полезно, пока вы не освоите кодирование. Кроме того, если вам нужно получить несколько наборов данных только один раз, у него есть инструмент экспорта, который запишет файл CSV, и вы можете пропустить кодирование. - person kcw78; 22.05.2019
comment
@ kcw78: Просмотр этих данных не очень поможет, поскольку они были написаны в определенном формате Pandas, который действительно имеет смысл только для Pandas. - person John Zwinck; 22.05.2019
comment
@Джон Цвик. Я понимаю, это похоже на уникальную схему Matlab. Это не столько данные, сколько структура данных, особенно для новых пользователей. ИМХО, я думаю, что макет группы/набора данных легче понять с визуальным представлением. - person kcw78; 22.05.2019

h5py будет получать доступ к наборам данных HDF5 в виде пустых массивов. Ваш вызов для получения ключей возвращает СПИСОК имен наборов данных. Теперь, когда они у вас есть, должно быть довольно просто получить к ним доступ как к массиву numpy и записать их. Вам нужно, чтобы dtype знал, что находится в каждом столбце для правильного форматирования.

Обновлено 22 мая 2019 г., чтобы отразить содержание data.h5, опубликованное по ссылке в комментарии. Формат по умолчанию в np.savetxt()'%.18e'. Предусмотрена очень простая (грубая) логика для изменения формата на основе dtype для этих наборов данных. Это требует более надежной проверки dtype и форматирования для общего использования. Кроме того, вам нужно будет добавить логику для декодирования строк Unicode.

import h5py
filename = 'D:\data.h5'
import numpy as np
h5f = h5py.File(filename, 'r')
# get a List of data sets in group 'dd48'
a_dset_keys = list(h5f['dd48'].keys())

# Get the data
for dset in a_dset_keys :
    ds_data = (h5f['dd48'][dset])
    print ('dataset=', dset)
    print (ds_data.dtype)
    if ds_data.dtype == 'float64' :
        csvfmt = '%.18e'
    elif ds_data.dtype == 'int64' :
        csvfmt = '%.10d'
    else:
        csvfmt = '%s'
    np.savetxt('output_'+dset+'.csv', ds_data, fmt=csvfmt, delimiter=',')
person kcw78    schedule 21.05.2019
comment
Спасибо за ваш ответ. Учитывая, что это data.h5, как мне настроить последнюю строку в вашем фрагменте для получения данных в правильном и читаемом формате в файле csv? Не могли бы вы сформировать свой полный ответ, обновив это. Я хотел бы узнать, как вы настраиваете правильное форматирование каждого столбца. Я также получил ошибку для data = list(f[grp]) как KeyError: "Unable to open object (object 'd' doesn't exist)" - person Mario; 21.05.2019
comment
Можете ли вы объяснить мне, что такое ['axis0', 'axis1', 'block0_items', 'block0_values', 'block1_items', 'block1_values'] ? как мы их называем технически и как мы должны знать о них с точки зрения извлечения данных? Они выглядят как какая-то папка, в которой есть какая-то информация. Не могли бы вы кратко объяснить их в своем ответе. - person Mario; 21.05.2019
comment
Марио, это имена узлов верхнего уровня в вашем файле. Узел может быть группой или набором данных. (Я предположил, что это наборы данных для моего кодирования). Вы можете использовать тест на isinstance(data, h5py.Dataset): для подтверждения наборов данных. Доступ к ним осуществляется по имени, как показано в коде data = list(f[grp]). data — это объект набора данных с именем grp из списка a_group_keys, который вы создали. - person kcw78; 22.05.2019
comment
спасибо за ваши объяснения. Поскольку я загрузил data.h5 в 1-м комментарии, я хотел бы преобразовать данные в формат .csv. Не могли бы вы завершить последнюю часть своего ответа на основе загруженного файла, чтобы я мог понять, как работает это предварительное преобразование в вашем предложенном ответе? Я попробовал data['dd48'].to_csv('data.csv') в конце вашего фрагмента, но у меня есть эта ошибка KeyError: "Unable to open object (object 'd' doesn't exist)" - person Mario; 22.05.2019
comment
Марио, я изменил код в своем начальном сообщении, чтобы отразить то, что я нашел в вашем файле data.h5. Показанные выше наборы данных находятся в корневой группе с именем 'dd48'. - person kcw78; 23.05.2019
comment
@Mario - вы смотрели на модификации и создание csv с помощью np.savetxt()? Было ли это полезно? - person kcw78; 24.05.2019
comment
О, да, но я нашел этот очень короткий код: import pandas as pd from pandas import HDFStore store = pd.HDFStore('data.h5') store['dd48'].to_csv('data.csv'), и он отлично работал, и мне было интересно, в чем преимущество предложенного вами ответа, а не в этом. Пожалуйста, проверьте это и дайте мне знать, сможем ли мы получить такой же результат, обновив его. - person Mario; 24.05.2019
comment
@Mario Используйте простое решение. :) Мой код подходит, если вы хотите работать именно с массивами numpy. Вероятно, слишком много для вашего сценария. - person kcw78; 24.05.2019