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

Posted

技术标签:

【中文标题】使用 H5Py 在 HDF5 中存储日期时间【英文标题】:Store datetimes in HDF5 with H5Py 【发布时间】:2014-06-27 13:10:31 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

目前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

【讨论】:

【参考方案2】:

目前 h5py 不支持时间类型(FAQ、Issue)。

NumPy datetime64s 有 8 个字节长。因此,作为一种解决方法,您可以将数据视为'&lt;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']]

【讨论】:

2017 年还是这样吗? 我们是否应该在 2018 年也这样做? 但是,在处理具有大量列的表时,这也意味着在某处存储哪些列是日期,哪些不是。 2020 年的建议相同吗?

以上是关于使用 H5Py 在 HDF5 中存储日期时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 h5py 将光栅图像添加到 HDF5 文件

关闭打开的 h5py 数据文件

h5py矩阵存储精度

使用 HDF5 库和 h5py 模块的交替错误

如何使用 h5py 读取只有数据集(无组)的 HDF5 文件?

使用 h5py 删除 hdf5 数据集