Храните дату и время в HDF5 с помощью H5Py

Как я могу хранить объекты даты и времени NumPy в HDF5, используя 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')

person MRocklin    schedule 09.05.2014    source источник


Ответы (2)


В настоящее время HDF5 не предоставляет тип времени (H5T_TIME теперь не поддерживается), поэтому нет очевидного сопоставления для datetime64.

Одной из целей разработки h5py было придерживаться базового набора функций HDF5. Это позволяет людям записывать данные в свои файлы и знать, что они будут передаваться туда и обратно и могут быть извлечены людьми, использующими другие приложения, поддерживающие HDF5, такие как IDL и Matlab. Ранее мы делали небольшие исключения; например, логические значения и комплексные числа NumPy сопоставляются с перечислениями HDF5 и составными типами соответственно. Но datetime64 кажется гораздо более сложным зверем.

Если не будет убедительного предложения, которое гарантирует, что (1) обмен информацией и (2) другие клиенты HDF5 могут разумно понять это, я думаю, что мы не собираемся реализовывать встроенную поддержку datetime64.

В HDF5 люди обычно хранят свои даты/время в виде строковых значений, используя некоторый вариант формата даты ISO. Вы можете рассматривать это как обходной путь.

См. также: https://github.com/h5py/h5py/issues/443.

person Andrew Collette    schedule 09.05.2014

В настоящее время h5py не поддерживает тип времени (FAQ, Проблема).

NumPy datetime64 имеет длину 8 байт. Таким образом, в качестве обходного пути вы можете просмотреть данные как '<i8' сохранить целые числа в файле hdf5 и просмотреть их как np.datetime64 после извлечения:

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']]
person unutbu    schedule 09.05.2014
comment
Это все еще актуально в 2017 году? - person Stefan Falk; 25.09.2017
comment
мы должны сделать то же самое в 2018 году? - person Jms; 06.02.2019
comment
Но при работе с таблицами с большим количеством столбцов это также означало бы хранить где-то, какие столбцы являются датами, а какие нет. - person Pythonista anonymous; 25.03.2019
comment
Тот же совет на 2020 год? - person adr; 20.10.2020