2014-05-09 19 views
7

Jak przechowywać obiekty DataTime NumPy w HDF5 przy użyciu h5py?Przechowuj dane w formacie HDF5 za pomocą telefonu H5Py

In [1]: import h5py 

In [2]: import numpy as np 

In [3]: f = h5py.File('foo.hdfs', 'w') 

In [4]: d = f.create_dataset('data', shape=(2, 2), dtype=np.datetime64) 
TypeError: No conversion path for dtype: dtype('<M8') 

Odpowiedz

13

Obecnie HDF5 nie przewiduje typ czasu (H5T_TIME jest obecnie nieobsługiwana) , więc nie ma oczywistego mapowania dla datetime64.

Jednym z celów projektu h5py było włożenie w podstawowy zestaw funkcji HDF5. Dzięki temu ludzie mogą zapisywać dane w swoich plikach i wiedzą, że będzie on w obie strony i będzie dostępny dla osób używających innych aplikacji obsługujących HDF5, takich jak IDL i Matlab. Już wcześniej robiliśmy kilka drobnych wyjątków; na przykład, Numery Bool i liczby zespolone są odwzorowane odpowiednio na emule HDF5 i typy złożone. Ale datetime64 wydaje się być o wiele bardziej skomplikowanym zwierzęciem.

Jeśli nie ma przekonującej propozycji, która gwarantuje, że (1) informacje w obie strony i (2) inni klienci HDF5 mogą rozsądnie to zrozumieć, myślę, że nie zamierzamy implementować natywnego wsparcia dla datetime64.

W HDF5 ludzie zazwyczaj przechowują swoje daty/godziny jako wartości ciągów przy użyciu pewnej odmiany formatu daty ISO. Możesz to potraktować jako obejście.

Zobacz także: https://github.com/h5py/h5py/issues/443

2

Obecnie h5py nie obsługuje typ czasu (FAQ, Issue).

NumPy datetime64 mają długość 8 bajtów. Więc jako obejście, można przeglądać dane jako '<i8' przechowywać ints w pliku HDF5 i wyświetlać je jako np.datetime64 momencie pobierania:

import numpy as np 
import h5py 

arr = np.linspace(0, 10000, 4).astype('<i8').view('<M8[D]').reshape((2,2)) 
print(arr) 
# [['1970-01-01' '1979-02-16'] 
# ['1988-04-02' '1997-05-19']] 
with h5py.File('/tmp/out.h5', "w") as f: 
    dset = f.create_dataset('data', (2, 2), '<i8') 
    dset[:,:] = arr.view('<i8') 
with h5py.File('/tmp/out.h5', "r") as f: 
    dset = f.get('data') 
    print(dset.value.view('<M8[D]')) 
    # [['1970-01-01' '1979-02-16'] 
    # ['1988-04-02' '1997-05-19']] 
+0

Czy to prawda w 2017 roku? – displayname