2013-05-11 24 views
10

Tôi có một cuốn từ điển, nơi mà quan trọng là đối tượng và giá trị datetime là tuple của số nguyên:Làm thế nào để lưu trữ từ điển trong HDF5 dataset

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

Tôi muốn lưu nó trong HDF5 bộ dữ liệu, nhưng nếu tôi cố gắng chỉ đổ từ điển h5py tăng lỗi:

TypeError: Object dtype dtype('object') has no native HDF5 equivalent

Cách tốt nhất để chuyển từ điển này để tôi có thể lưu trữ trong bộ dữ liệu HDF5 là gì?

Cụ thể là tôi không muốn chỉ từ bỏ từ điển trong mảng có nhiều mảng, vì nó sẽ phức tạp truy xuất dữ liệu dựa trên truy vấn datetime.

Trả lời

10

tôi thấy hai cách sau:

I) chuyển đổi đối tượng datetime để chuỗi và sử dụng nó như tên tập dữ liệu

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

nơi dữ liệu có thể được truy cập bằng quering chuỗi chìa khóa (bộ dữ liệu tên) . Ví dụ:

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

II) chuyển đổi đối tượng datetime để phân nhóm dữ liệu

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

thông báo dấu gạch chéo trong chuỗi strftime, mà sẽ tạo ra các phân nhóm thích hợp trong tập tin HDF. Dữ liệu có thể được truy cập trực tiếp như h['2012']['04']['05']['23:30'].value hoặc bằng cách lặp lại với các trình lặp h5py được cung cấp hoặc thậm chí bằng cách sử dụng các chức năng tùy chỉnh qua visititems()

Để đơn giản, tôi chọn tùy chọn đầu tiên.

+0

Bạn chỉ có thể chuyển từ điển sang chuỗi và sau đó sử dụng thư viện ast để giải mã từ điển. Giải pháp này, nói chung, nên làm việc trong nhiều trường hợp. –

4

Tôi sẽ tuần tự hóa đối tượng thành JSON hoặc YAML và lưu trữ chuỗi kết quả dưới dạng thuộc tính trong đối tượng thích hợp (nhóm HDF5 hoặc tập dữ liệu).

Tôi không chắc chắn lý do tại sao bạn sử dụng datetime làm tên tập dữ liệu, tuy nhiên, trừ khi bạn hoàn toàn cần tìm kiếm tập dữ liệu của mình trực tiếp trước ngày giờ.

p.s. Đối với những gì nó có giá trị, PyTables is a lot easier to use than the low-level h5py.

2

Ngày nay chúng ta có deepdish (www.deepdish.io):

import deepdish as dd 
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9)) 
1

Câu hỏi này liên quan đến các câu hỏi tổng quát hơn của việc có thể để lưu trữ bất kỳ loại từ điển ở định dạng HDF5. Đầu tiên, chuyển từ điển sang chuỗi. Sau đó, để khôi phục từ điển, hãy sử dụng thư viện ast bằng cách sử dụng lệnh import ast. Đoạn mã sau đây đưa ra một ví dụ.

>>> 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'> 
Các vấn đề liên quan