2013-05-11 9 views
10

Ho un dizionario, dove la chiave è oggetto e il valore datetime è tupla di interi:Come conservare dizionario in HDF5 dataset

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

voglio conservarlo in HDF5 set di dati, ma se cerco di appena discarica il h5py dizionario genera l'errore:

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

Quale sarebbe "il miglior" modo per trasformare questo dizionario in modo che possa conservarlo in HDF5 set di dati?

In particolare, non voglio semplicemente scaricare il dizionario in serie numpy, poiché complicherebbe il recupero dei dati basato sulla query datetime.

risposta

10

ho trovato due modi per questo:

I) trasformare oggetto datetime a stringa e usarlo come nome del dataset

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

cui i dati possono essere accessibili da quering stringhe chiave (nome set di dati) . Per esempio:

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

II) trasformare oggetto datetime per sottogruppi del set di dati

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

Avviso slash in string strftime, che creerà sottogruppi appropriate nel file di HDF. È possibile accedere ai dati direttamente come h['2012']['04']['05']['23:30'].value o eseguendo iterazioni con h5py iterators o utilizzando le funzioni personalizzate tramite visititems()

Per semplicità, scelgo la prima opzione.

+0

È possibile convertire il dizionario in una stringa e utilizzare la libreria ast per decodificare il dizionario. Questa soluzione, in generale, dovrebbe funzionare in molti casi. –

4

Vorrei serializzare l'oggetto in JSON o YAML e memorizzare la stringa risultante come attributo nell'oggetto appropriato (gruppo HDF5 o set di dati).

Non sono sicuro del motivo per cui si utilizza il datetime come nome del set di dati, tuttavia, a meno che non sia assolutamente necessario cercare il set di dati direttamente tramite datetime.

p.s. Per quello che vale, PyTables is a lot easier to use than the low-level h5py.

2

Oggi abbiamo deepdish (www.deepdish.io):

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

Questa domanda riguarda la questione più generale di essere in grado di memorizzare qualsiasi tipo di dizionario in formato HDF5. Innanzitutto, converti il ​​dizionario in una stringa. Quindi per ripristinare il dizionario, utilizzare la libreria ast utilizzando il comando import ast. Il seguente codice fornisce un esempio.

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