我有一个字典,其中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同时存储为属性。
这个问题涉及能够以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'>
Run Code Online (Sandbox Code Playgroud)
我将对象序列化为JSON或YAML,并将结果字符串作为属性存储在适当的对象(HDF5组或数据集)中.
我不确定为什么你使用datetime作为数据集名称,除非你绝对需要直接按日期时间查找数据集.
ps对于它的价值,PyTables比低级别的h5py更容易使用.
如今,我们已经深陷于困境(www.deepdish.io):
import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27004 次 |
| 最近记录: |