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

问题描述 投票:21回答:4

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

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

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

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

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

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

python h5py
4个回答
13
投票

我找到了两种方法:

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))

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

for ds in h.keys():
    if '2012-04' in ds:
        print(h[ds].value)

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))

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

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


7
投票

这个问题涉及能够以HDF5格式存储任何类型的字典的更一般的问题。首先,将字典转换为字符串。然后要恢复字典,请使用ast命令使用import 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'>

5
投票

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

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

附:对于它的价值,PyTables is a lot easier to use than the low-level h5py


4
投票

现在我们已经深陷了(www.deepdish.io):

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.