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

13 投票
2 回答
9887 浏览
提问于 2025-04-18 06:01

我该如何使用 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 个回答

13

目前,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']]
22

现在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

撰写回答