sto sperimentando alcune interazioni davvero strano tra h5py, PyTables (via Pandas), e C++ generati HDF5 file. Sembra che, h5check e h5py sembrano gestire i nomi di tipo contenenti '/', ma non lo è pandas/PyTables. Chiaramente, c'è una lacuna nella mia comprensione, quindi:'/' nei nomi di file HDF5 confusione
Cosa non ho capito qui?
I dettagli scabrosi
ho i seguenti dati in un file di HDF5:
[...]
DATASET "log" {
DATATYPE H5T_COMPOUND {
H5T_COMPOUND {
H5T_STD_U32LE "sec";
H5T_STD_U32LE "usec";
} "time";
H5T_IEEE_F32LE "CIF/align/aft_port_end/extend_pressure";
[...]
questo è stato creato tramite l'API C++. L'utility h5check dice che il file è valido.
Si noti che CIF/align/aft_port_end/extend_pressure
non è inteso come percorso per un gruppo/nodo/foglia. È un'etichetta, che usiamo internamente, che ha una struttura interna che contiene '/' come delimitatori. Non vogliamo che il file HDF5 sappia nulla a riguardo: non dovrebbe importare. Chiaramente, se '/' sono illegali in qualsiasi nome HDF5, allora dobbiamo cambiare quel delimitatore in qualcos'altro.
Utilizzando PyTables (ok, Pandas ma utilizza PyTables internamente) per leggere il file, ottengo un
>>> import pandas as pd
>>> store = pd.HDFStore('data/XXX-20150423-071618.h5')
>>> store
/home/XXX/virt/env/develop/lib/python2.7/site-packages/tables/group. py:1156: UserWarning: problems loading leaf ``/log``::
the ``/`` character is not allowed in object names: 'XXX/align/aft_port_end/extend_pressure'
The leaf will become an ``UnImplemented`` node.
ho chiesto spiegazioni in questo question e got told che '/' sono illegal in the specification. Tuttavia, le cose si fanno sconosciuto con h5py ...
Utilizzando h5py per leggere il file, ottengo ciò che voglio:
>>> f['/log'].dtype
>>> dtype([('time', [('sec', '<u4'), ('usec', '<u4')]), ('CI
F/align/aft_port_end/extend_pressure', '<f4')[...]
che è più o meno quello che ho deciso con.
Inutile dire che sono confuso. Sono riuscito a creare un file HDF5 illegale che in qualche modo supera h5check? PyTables non supporta questo caso limite? ... Sono confuso.
Chiaramente, potrei scrivere un semplice involucro qualcosa di simile:
>>> import matplotlib.pyplot as plt
>>> silly = pd.DataFrame(f['/log']['CIF/align/aft_port_end/extend_pressure'])
>>> silly.plot()
>>> plt.show()
per ottenere tutti i dati dal file HDF5 in Pandas. Tuttavia, non sono sicuro che questa sia una buona idea a causa della confusione precedente. La mia più grande preoccupazione è la conversione potrebbe non scalare se i dati sono molto grandi ...
In alto votati, accettati e generosi come questa è stata la migliore risposta. – Sardathrion
@Sardathrion, il tuo file è perfettamente a posto. Non sono presenti restrizioni relative alle barre di cui sono a conoscenza sulle etichette dei membri del tipo composto. Il documento che hai collegato fa riferimento ai nomi nello spazio dei nomi "gruppo"; cioè i percorsi in stile POSIX agli oggetti nel file. –
@ andrew-collette: pensi che sia un bug in PyTables allora? Sardathrion, anche se ho apparentemente interpretato erroneamente le specifiche e il file è corretto, sostengo il mio punto: utilizzando le barre si rischia di imbattersi in problemi con altre librerie e programmi. Questo può essere facilmente evitato sostituendoli. – titusjan