【问题标题】:How can you take care of Endianness reading from H5PY into Pandas DataFrame?如何处理从 H5PY 读取到 Pandas DataFrame 的字节顺序?
【发布时间】:2019-10-11 20:26:26
【问题描述】:

我想通过说我没有任何代码可以重现我所遇到的错误来介绍这个问题的描述。不过,我可以(希望)详细解释这个问题。

在我的工作中,我们处理大量数据,这些数据来自各种来源。其中一些来源使用 Big Endian,一些使用 Small Endian。所有这些数据都被解析并存储到一个 h5 文件中。

我开发的工具利用 Pandas 数据框以多种方式处理数据。

我们的 H5 文件的设置方式似乎不适用于 Pandas 的 df.read_h5() 函数调用(数据并不总是具有良好的结构,即使在 h5 文件中也是如此)。我们有不同的函数来处理我们遇到的从 h5 文件中提取数据的所有场景。我们的大部分数据以 numpy 结构化数组或结构化数组切片的形式存储在 h5 文件中。

基本上每当我获取数据并尝试将其放入数据框中时,Pandas 都会出现一些问题。抛出的错误是“ValueError: Big-endian buffer not supported on little-endian compiler”。我知道如何解决这个问题,只需在将底层 numpy 数组放入数据帧之前调用一个字节交换。这就是我目前处理这个问题的方式,但我想知道是否有办法将数据从 h5py 读取到机器本机字节序中,这样我就不必担心进行字节交换。

任何建议都会有所帮助。

【问题讨论】:

  • 您可以使用h5py 浏览文件。这是一个较低级别的接口,产生numpy 数组。它可以更好地处理结束,因为 numpy 可以有 dtype >f8<f8。您可以从一个或多个数组创建数据框。这只是一个猜测,因为我从来没有处理过这样的文件。

标签: python pandas endianness h5py


【解决方案1】:

h5py

In [1]: import h5py                                                             
In [2]: f = h5py.File('testendedness.h5','w')                                   
In [3]: f.create_dataset('less',data=np.arange(5.).astype('<f8'))               
Out[3]: <HDF5 dataset "less": shape (5,), type "<f8">
In [4]: f.create_dataset('greater',data=np.arange(5.).astype('>f8'))            
Out[4]: <HDF5 dataset "greater": shape (5,), type ">f8">
In [5]: f.flush()                                                               
In [6]: f.close()

在外壳中

1409:~/mypy$ h5dump testendedness.h5
HDF5 "testendedness.h5" {
GROUP "/" {
   DATASET "greater" {
      DATATYPE  H5T_IEEE_F64BE
      DATASPACE  SIMPLE { ( 5 ) / ( 5 ) }
      DATA {
      (0): 0, 1, 2, 3, 4
      }
   }
   DATASET "less" {
      DATATYPE  H5T_IEEE_F64LE
      DATASPACE  SIMPLE { ( 5 ) / ( 5 ) }
      DATA {
      (0): 0, 1, 2, 3, 4
      }
   }
}
}

【讨论】:

  • 是的,这看起来是在 h5py 中创建具有特定字节顺序的数据集的好方法,但是,我们拥有的文件不是我们创建的。此外,这不会重现 OP 中提到的 Big-Endian 错误。
猜你喜欢
  • 1970-01-01
  • 2020-01-10
  • 2020-05-28
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多