Sar*_*ica 16 python hdf5 pytables h5py pandas
我在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";
[...]
Run Code Online (Sandbox Code Playgroud)
这是通过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.
Run Code Online (Sandbox Code Playgroud)
我在这个问题中询问过这个问题并且被告知 '/' 在规范中是非法的.然而,h5py的事情变得陌生......
使用h5py读取文件,我得到我想要的:
>>> f['/log'].dtype
>>> dtype([('time', [('sec', '<u4'), ('usec', '<u4')]), ('CI
F/align/aft_port_end/extend_pressure', '<f4')[...]
Run Code Online (Sandbox Code Playgroud)
这或多或少是我的目标.
不用说,我很困惑.我设法创建了一个非法的HDF5文件,以某种方式通过h5check?是PyTables不支持这种特殊情况?... 我很迷惑.
显然,我可以写一个这样的简单包装器:
>>> import matplotlib.pyplot as plt
>>> silly = pd.DataFrame(f['/log']['CIF/align/aft_port_end/extend_pressure'])
>>> silly.plot()
>>> plt.show()
Run Code Online (Sandbox Code Playgroud)
从HDF5文件中获取所有数据到Pandas.但是,由于之前的混乱,我不确定这是不是一个好主意.我最担心的是,如果数据非常大,转换可能无法扩展......
我浏览了一下h5check源代码,如果一个名字包含一个斜杠,我找不到它测试的任何地方.您可以检查它可以生成的错误消息:
grep error_push h5checker.c -A1
Run Code Online (Sandbox Code Playgroud)
您提供的链接明确指出对象名称中不允许使用斜杠.所以是的,我认为你已经制作了一个非法的文件,但通过了h5check.该工具似乎更关注二进制数据布局.我能找到的最接近的相关检查是防止重复的名字.
在我看来,这就是它的全部.事实上,h5py和其他库以某种方式能够创建或读取这个非法文件是无关紧要的.规范说"不要在对象名称中添加斜杠",所以你不这样做.故事结局.
如果你不相信,可以这样想:如果你以某种方式设法创建一个带有文件名斜杠的常规文件,会发生什么?大多数程序假定文件名不包含斜杠,因此它们能够通过将斜杠字符拆分为目录路径来对其进行分区.您的文件将破坏此行为,因此引入许多微妙(而不是那么微妙)的错误.用户会抱怨,程序员会讨厌你,系统管理员会诅咒你.
同样可以安全地假设,旁边的PyTables许多其他库和程序将无法处理变量名中的斜杠.关于HDF的好处在于它存在很多工具,并且通过使用斜杠可以省去这个优势.您可能认为这并不重要,也许您的HDF-5文件仅供内部使用.但是,情况可能会在5年内发生变化,这种情况往往会发生.
只需咬紧牙关,用'|'替换'/' 在将变量写入HDF5之前.阅读时将它们更换回来.通过实施此操作而失去的时间,您将通过避免未来的错误和用户投诉赢回x-fold (x> 1).
抱歉咆哮,但我希望能说服你.