Występują niektóre naprawdę dziwne interakcje między h5py, PyTables (przez Pandas) i C++ wygenerowane pliki HDF5. Wydaje się, że h5check i h5py wydają się radzić sobie z nazwami typów zawierającymi "/", ale nie może. Najwyraźniej istnieje luka w moim rozumieniu, więc:"/" w nazwach w zamieszaniu plików HDF5
Czego tu nie rozumiem?
Gór szczegółów
Mam następujące dane w pliku 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";
[...]
ten został utworzony za pomocą C++ API. Narzędzie h5check mówi, że plik jest prawidłowy.
Należy pamiętać, że CIF/align/aft_port_end/extend_pressure
nie jest rozumiane jako ścieżka do grupy/węzła/liścia. Jest to etykieta, którą używamy wewnętrznie, która ma wewnętrzną strukturę zawierającą znaki "/" jako ograniczniki. Nie chcemy, aby plik HDF5 wiedział o tym coś: nie powinno to obchodzić. Oczywiście, jeśli "/" są nielegalne w nazwie HDF5, to musimy zmienić to ograniczenie na coś innego.
Korzystanie PyTables (w porządku, Pandas ale używa PyTables wewnętrznie) do odczytu pliku, otrzymuję
>>> 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.
Pytałem o to w tym question i got told że '/' są illegal in the specification. Jednak sprawy się obcy z h5py ...
Korzystanie h5py do odczytu pliku, mam co chcę:
>>> f['/log'].dtype
>>> dtype([('time', [('sec', '<u4'), ('usec', '<u4')]), ('CI
F/align/aft_port_end/extend_pressure', '<f4')[...]
Który jest mniej więcej to, co określono z.
Nie trzeba dodawać, jestem zdezorientowany. Czy udało mi się utworzyć nielegalny plik HDF5, który w jakiś sposób mija h5check? Czy PyTables nie obsługuje tego przypadku krawędzi? ... Jestem zdezorientowany.
Oczywiście, mógłbym napisać prosty wrapper coś takiego:
>>> import matplotlib.pyplot as plt
>>> silly = pd.DataFrame(f['/log']['CIF/align/aft_port_end/extend_pressure'])
>>> silly.plot()
>>> plt.show()
uzyskać wszystkie dane z pliku HDF5 do Pandas. Jednak nie jestem pewien, czy jest to dobry pomysł z powodu wcześniejszego zamieszania. Moją największą obawą jest to, że konwersja może nie być skalowalna, jeśli dane są bardzo duże ...
Wygraliśmy głosowanie, przyjęcie i nagrodę, ponieważ była to najlepsza odpowiedź. – Sardathrion
@Sardathrion, twój plik jest całkowicie w porządku. Nie ma żadnych ograniczeń związanych z odcięciem, które znam na etykietach członków typu złożonego. Dokument, który łączysz, odnosi się do nazw w przestrzeni nazw "grup"; tj. ścieżki w stylu POSIX do obiektów w pliku. –
@ andrew-collette: myślisz, że to jest błąd w PyTables? Sardathrion, chociaż najwyraźniej błędnie zinterpretowałem specyfikacje, a plik jest poprawny, podtrzymuję mój punkt widzenia: używając slashów, ryzykujesz problemami z innymi bibliotekami i programami. Można tego łatwo uniknąć, zastępując je. – titusjan