我有一个字典,其中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数组中,因为它会使基于日期时间查询的数据检索变得复杂。
我找到了两种方法:
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()
使用自定义函数
为简单起见,我选择第一个选项。
这个问题涉及能够以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'>
我将对象序列化为JSON或YAML,并将结果字符串作为属性存储在适当的对象(HDF5组或数据集)中。
我不确定为什么你使用datetime作为数据集名称,除非你绝对需要直接按日期时间查找数据集。
附:对于它的价值,PyTables is a lot easier to use than the low-level h5py。
现在我们已经深陷了(www.deepdish.io):
import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))