Я хотел бы прочитать файл hdf5 2D_rdb_NA_NA.h5. В файле есть родительские группы: 000000010002 и т. д. У каждой родительской группы есть дочерние группы data и grid.
Вот что я пытался до сих пор:
import h5py
import pandas as pd
data = h5py.File('2D_rdb_NA_NA.h5', 'r')
print(list(data.keys()))
['0000', '0001', '0002', '0003', '0004', '0005', '0006', '0007', '0008', '0009', '0010', ...
print(list(data['0000'].keys()))
['data', 'grid']
data['0000']['data']
<HDF5 dataset "data": shape (101, 128, 128, 1), type "<f4">
df = pd.read_hdf('2D_rdb_NA_NA.h5', key='0000')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[11], line 1
----> 1 df = pd.read_hdf('2D_rdb_NA_NA.h5', '0000')
File ~/lib/python3.10/site-packages/pandas/io/pytables.py:442, in read_hdf(path_or_buf, key, mode, errors, where, start, stop, columns, iterator, chunksize, **kwargs)
437 raise ValueError(
438 "key must be provided when HDF5 "
439 "file contains multiple datasets."
440 )
441 key = candidate_only_group._v_pathname
--> 442 return store.select(
443 key,
444 where=where,
445 start=start,
446 stop=stop,
447 columns=columns,
448 iterator=iterator,
449 chunksize=chunksize,
450 auto_close=auto_close,
451 )
452 except (ValueError, TypeError, KeyError):
453 if not isinstance(path_or_buf, HDFStore):
454 # if there is an error, close the store if we opened it.
...
1679 )
1680 else:
1681 if isinstance(value, Series):
TypeError: cannot create a storer if the object is not existing nor a value are passed
df = pd.read_hdf('2D_rdb_NA_NA.h5', key='0000/data') возвращает ту же ошибку. Если для этого невозможно использовать Pandas, придется использовать решение h5py.






Я думаю, у вас есть небольшая ошибка в определении ключа. PyTables (пакет, который Pandas использует для чтения данных HDF5) требует определенного пути, начинающегося с «/». Попробуй это:
df_d = pd.read_hdf('2D_rdb_NA_NA.h5', key='/0000/data') # include the leading /
df_g = pd.read_hdf('2D_rdb_NA_NA.h5', key='/0000/grid') # same
Я также внес небольшую правку в свой вопрос: data['0000']['data'] возвращает <HDF5 dataset "data": shape (101, 128, 128, 1), type "<f4">. Возможно, это даст больше информации.
Да, я создал несколько тестовых файлов для сравнения файлов из pandas и h5py. Потом я ошибся при тестировании pd.read_hdf() с каждым файлом, и пришел к неверному выводу выше. Смотрите новый ответ ниже.
Я думаю, проблема в том, что ваш файл HDF5 не был создан с помощью Pandas (и Pandas ожидает, что определенный формат/схема будет читать файлы h5). Я создал 2 тестовых файла, чтобы продемонстрировать разницу на основе пакета, использованного для создания файла. Код для создания двух файлов находится в конце.
Начните с опроса файла HDF5 с помощью метода .info() из pandas.HDFStore API. См. ниже:
with pd.HDFStore('SO_76007953_pd.h5') as h5_store:
print(h5_store.info())
Это создаст МНОГО вывода, если файл был создан с помощью Pandas. Вывод для файла, который я создал с помощью Pandas:
<class 'pandas.io.pytables.HDFStore'>
File path: SO_76007953_pd.h5
/0000/data frame_table (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0000/grid frame_table (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0001/data frame_table (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0001/grid frame_table (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0002/data frame_table (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0002/grid frame_table (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
Однако, если он НЕ был создан с помощью Pandas, вы получите очень мало вывода. Вывод для файла, созданного с помощью h5py:
<class 'pandas.io.pytables.HDFStore'>
File path: SO_76007953.h5
Empty
Если ваш файл был создан с помощью Pandas, вы сможете прочитать наборы данных со следующим:
df_d = pd.read_hdf('SO_76007953_pd.h5', key='/0000/data')
df_g = pd.read_hdf('SO_76007953_pd.h5', key='/0000/grid')
Однако, основываясь на ваших комментариях, я ожидаю, что вы получите «Пустой» при проверке файла h5. Вот почему pd.read_hdf() не работает. Если это так, вам нужно использовать другой пакет (h5py или PyTables, также известный как tables).
Вот короткий фрагмент кода, показывающий, как открыть файл с помощью h5py, перебрать группы и прочитать наборы данных data и grid либо в объект набора данных h5py, либо в массив numpy.
with h5py.File('2D_rdb_NA_NA.h5') as h5f:
for g_name, g_obj in h5f.items():
print(g_name)
data_ds = g_obj['data'] # this returns a h5py dataset object
data_arr = g_obj['data'][()] # this returns a numpy object
grid_ds = g_obj['grid']
grid_arr = g_obj['grid'][()]
Вот код для создания 2 файлов HDF5, 1 с Pandas и другой с h5py. Запустите их оба, затем проверьте с помощью HDFView. Когда вы это сделаете, вы увидите несколько отличий.
grid и data в файле Pandas будут группами (а не наборами данных), а данные будут в группах и наборах данных под каждым ключом/группой.Код для создания с Pandas:
for i in range(3):
df_g = pd.DataFrame( [(v+10*i) for v in range(10)] )
df_d = pd.DataFrame( [(v/10.+10*i) for v in range(10) ] )
grp = f'{i:04d}'
df_g.to_hdf('SO_76007953_pd.h5', key=grp+'/grid', mode='a', format='table')
df_d.to_hdf('SO_76007953_pd.h5', key=grp+'/data', mode='a', format='table')
Код для создания с помощью h5py:
with h5py.File('SO_76007953.h5','w') as h5f:
for i in range(3):
grp = h5f.create_group(f'{i:04d}')
grp.create_dataset('grid', data=[ (v+10*i) for v in range(10)] )
grp.create_dataset('data', data=[ (v/10.+10*i) for v in range(10)])
Я получаю ту же ошибку:
TypeError: cannot create a storer if the object is not existing nor a value are passed