【发布时间】:2015-07-16 05:47:41
【问题描述】:
我在h5py、PyTables(通过Pandas)和C++ 生成的HDF5 文件之间遇到了一些非常奇怪的交互。看来,h5check 和 h5py 似乎可以处理包含“/”的类型名称,但 pandas/PyTables 不能。显然,我的理解存在差距,所以:
这里有什么不明白的地方?
血淋淋的细节
我在 HDF5 文件中有以下数据:
[...]
DATASET "log" {
DATATYPE H5T_COMPOUND {
H5T_COMPOUND {
H5T_STD_U32LE "sec";
H5T_STD_U32LE "usec";
} "time";
H5T_IEEE_F32LE "CIF/align/aft_port_end/extend_pressure";
[...]
这是通过 C++ API 创建的。 h5check 实用程序表示文件有效。
请注意,CIF/align/aft_port_end/extend_pressure 不是指向组/节点/叶的路径。它是一个标签,我们在内部使用它恰好有一些包含“/”作为分隔符的内部结构。我们不希望 HDF5 文件对此有所了解:它不应该关心。显然,如果任何 HDF5 名称中的“/”都是非法的,那么我们必须将该分隔符更改为其他内容。
使用 PyTables(好吧,Pandas 但它在内部使用PyTables)读取文件,我得到一个
>>> import pandas as pd
>>> store = pd.HDFStore('data/XXX-20150423-071618.h5')
>>> store
/home/XXX/virt/env/develop/lib/python2.7/site-packages/tables/group. py:1156: UserWarning: problems loading leaf ``/log``::
the ``/`` character is not allowed in object names: 'XXX/align/aft_port_end/extend_pressure'
The leaf will become an ``UnImplemented`` node.
我在question 和got told 中询问了这个'/' 是illegal in the specification。然而,h5py 让事情变得陌生...
使用h5py读取文件,得到我想要的:
>>> f['/log'].dtype
>>> dtype([('time', [('sec', '<u4'), ('usec', '<u4')]), ('CI
F/align/aft_port_end/extend_pressure', '<f4')[...]
这或多或少是我的出发点。
不用说,我很困惑。我是否设法创建了一个以某种方式通过h5check 的非法HDF5 文件? PyTables 不支持这种极端情况吗? ...我很困惑。
显然,我可以编写一个类似这样的简单包装器:
>>> import matplotlib.pyplot as plt
>>> silly = pd.DataFrame(f['/log']['CIF/align/aft_port_end/extend_pressure'])
>>> silly.plot()
>>> plt.show()
将所有数据从HDF5 文件中获取到Pandas。但是,由于之前的混淆,我不确定这是否是一个好主意。我最担心的是如果数据非常大,转换可能无法扩展......
【问题讨论】:
标签: python pandas hdf5 pytables h5py