python-熊猫和h5py加载相同的数据(ndarray)的方式不同

我有一个HDF5格式的文件.它是使用HDF5的C API通过以下方式创建的:

struct SignalDefH5
{
    char  id   [128];
    char  name [ 64];
    char  units[ 16];
    float min;
    float max;
    hvl_t tags; /* This right there does not work in Pandas... */
};

struct TagDefH5
{
    char  tag [ 64];
    char  desc[256];
};

如果我使用h5py加载文件,则会得到以下信息:

>>> import h5py
>>> hfile = h5py.File('test.h5', 'r')
>>> signals = hfile['/signals']
>>> signals[0]
('id1', 'a pressure', 'bar', 0.0, 300.0, ['Pressure'])
>>> type(signals[0][5])
numpy.ndarray

但是,如果我使用Pandas加载相同的文件,则会得到以下信息:

>>> store = pd.HDFStore('test.h5')
>>> store.root.signals
/signals (Table(179,)) ''
  description := {
  "id": StringCol(itemsize=128, shape=(), dflt='', pos=0),
  "name": StringCol(itemsize=64, shape=(), dflt='', pos=1),
  "units": StringCol(itemsize=16, shape=(), dflt='', pos=2),
  "min": Float32Col(shape=(), dflt=0.0, pos=3),
  "max": Float32Col(shape=(), dflt=0.0, pos=4),
  "tags": StringCol(itemsize=64, shape=(), dflt='', pos=5)}
  byteorder := 'little'
  chunkshape := (234,)
>>> store.root.signals[0]
('id1', 'a pressure', 'bar', 0.0, 300.0, '\x02\x00\x00\x00\x00\x00\x00\x00\xf0f\x1e\x04\x00\x00\x00\x00\xba\nVT\xd1!\xa7\xdd\xb0\xe3\x9a\x02\x00\x00\x00\x00@\xecR\x1f\xa2\x7f\x00\x00}B\x178\x96\xa4u\xe6\xb0\xdd\x7f\x02\x00\x00\x00\x00 \x01')
>>> type(store.root.signals[0][5])
numpy.string_

显然Pandas方式存在问题:我做错了什么?

> Python版本是2.7.5.
> h5py版本是2.4.0.
>熊猫版本为0.16.0.
> PyTables版本是3.1.1.

解决方法:

熊猫HDF5支持使用PyTables.这在顶部提供了一个元数据层,它本身(即PyTables)位于原始HDF5的顶部. h5py是原始HDF5.

所以熊猫不知道子领域,例如实际是什么.您将得到一个原始字节字符串.

根本不支持此类嵌套结构.这些不能很好地映射到熊猫结构.此外,通过在原始HDF5中创建此文件,您会丢失大量熊猫需要解释的元数据.

只需使用PyTables / pandas编写数据即可.然后,您可以在c中对该格式进行逆向工程.

上一篇:python-如何添加一个单独的colobar,它将显示来自2个不同子图的数据


下一篇:如何在python / scipy中有效地组装大型稀疏矩阵