使用H5Py在HDF5中存储日期时间

12

我该如何使用h5py将NumPy的日期时间对象存储在HDF5中?

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')
2个回答

21

目前 HDF5 不提供时间类型(H5T_TIME 现在不受支持),因此 datetime64 没有明显的映射。

h5py 的设计目标之一是固守基本的 HDF5 特性集。这使得人们可以将数据写入文件并确信它会往返传输,并可被使用其他 HDF5-aware 应用程序如 IDL 和 Matlab 的人检索。我们以前做过一些小的例外;例如,NumPy 布尔值和复数被分别映射到 HDF5 枚举和复合类型。但是,datetime64 似乎更为复杂。

除非有一个令人信服的提案,可以确保 (1) 信息可以往返传输,且(2)其他 HDF5 客户端可以合理地理解它,否则我们不会实现 datetime64 的本地支持。

在 HDF5 中,人们通常使用 ISO 日期格式的某个变体将其日期/时间存储为字符串值。您可以考虑将其作为解决方法。

另请参见:https://github.com/h5py/h5py/issues/443


12

目前h5py不支持时间类型 (常见问题, 问题)。

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

3
2017年是否仍然正确? - Stefan Falk
1
我们在2018年应该做同样的事情吗? - Jms
但是,当处理具有大量列的表时,这也意味着需要存储哪些列是日期,哪些不是。 - Pythonista anonymous
1
2020年同样的建议吗? - adr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接