使用H5Py在HDF5中存储日期时间
我该如何使用 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日期格式。你可以考虑这作为一种解决方法。