如何在HDF5数据集中存储字典

the*_*eta 24 python h5py

我有一个字典,其中key是datetime对象,value是整数元组:

>>> d.items()[0]
(datetime.datetime(2012, 4, 5, 23, 30), (14, 1014, 6, 3, 0))
Run Code Online (Sandbox Code Playgroud)

我想将它存储在HDF5数据集中,但是如果我尝试只是转储字典h5py会引发错误:

TypeError:Object dtype dtype('object')没有等效的原生HDF5

什么是"最好"的方式来转换这个字典,以便我可以将它存储在HDF5数据集中?

具体来说,我不想只是将字典转储到numpy数组中,因为它会使基于日期时间查询的数据检索变得复杂.

the*_*eta 14

我找到了两种方法:

I)将datetime对象转换为字符串并将其用作数据集名称

h = h5py.File('myfile.hdf5')
for k, v in d.items():
    h.create_dataset(k.strftime('%Y-%m-%dT%H:%M:%SZ'), data=np.array(v, dtype=np.int8))
Run Code Online (Sandbox Code Playgroud)

可以通过查询键字符串(数据集名称)来访问数据.例如:

for ds in h.keys():
    if '2012-04' in ds:
        print(h[ds].value)
Run Code Online (Sandbox Code Playgroud)

II)将datetime对象转换为数据集子组

h = h5py.File('myfile.hdf5')
for k, v in d.items():
    h.create_dataset(k.strftime('%Y/%m/%d/%H:%M'), data=np.array(v, dtype=np.int8))
Run Code Online (Sandbox Code Playgroud)

注意strftime字符串中的正斜杠,它将在HDF文件中创建适当的子组.数据可以直接访问h['2012']['04']['05']['23:30'].value,也可以通过迭代使用提供的h5py迭代器,甚至通过使用自定义函数来访问visititems()

为简单起见,我选择第一个选项.


Vai*_*xit 10

之前的答案旨在将 Python 字典存储为 hdf5 数据集。以下代码可用于将Python字典存储为hdf5属性(元数据),这是更合乎逻辑的方法:

import h5py
import numpy as np

#Writing data
d1 = np.random.random(size=(1000, 20))  # Sample data
hf = h5py.File("test_data.h5", "w")
dset1 = hf.create_dataset("dataset_1", data=d1)
#set some metadata directly
hf.attrs["metadata1"] = 5

#sample dictionary object
sample_dict = {
    "metadata2": 1, "metadata3": 2, 
    "metadata4": "blah_blah"
}

#Store this dictionary object as hdf5 metadata
hf.attrs.update(sample_dict)
hf.close()

#Reading data
hf1 = h5py.File("test_data.h5", "r")
for name in hf1:
    print(name)

print(hf1.attrs.keys())
hf1.close()
Run Code Online (Sandbox Code Playgroud)

这给出的输出为

dataset_1
<KeysViewHDF5 ['metadata1', 'metadata2', 'metadata3', 'metadata4']>
Run Code Online (Sandbox Code Playgroud)

这意味着直接指定为属性的元数据1和从字典对象获得的元数据2、3、4同时存储为属性。


Ame*_*nde 8

这个问题涉及能够以HDF5格式存储任何类型的字典的更一般的问题.首先,将字典转换为字符串.然后要恢复字典,请使用astimport ast命令使用该库.以下代码给出了一个示例.

>>> d = {1:"a",2:"b"}
>>> s = str(d)
>>> s
"{1: 'a', 2: 'b'}"
>>> ast.literal_eval(s)
{1: 'a', 2: 'b'}
>>> type(ast.literal_eval(s))
<type 'dict'>
Run Code Online (Sandbox Code Playgroud)


Jas*_*n S 5

我将对象序列化为JSON或YAML,并将结果字符串作为属性存储在适当的对象(HDF5组或数据集)中.

我不确定为什么你使用datetime作为数据集名称,除非你绝对需要直接按日期时间查找数据集.

ps对于它的价值,PyTables比低级别的h5py更容易使用.


wor*_*ise 5

如今,我们已经深陷于困境(www.deepdish.io):

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
Run Code Online (Sandbox Code Playgroud)