【问题标题】:Converting a dataset into an HDF5 dataset将数据集转换为 HDF5 数据集
【发布时间】:2015-11-28 06:34:27
【问题描述】:

我有一个想要转换为 HDF5 格式的数据集。 它是来自NOAA 的数据集。 目录结构类似于:

NOAA
├── code
├── ghcnd_all
├── ghcnd_all.tar.gz
├── ghcnd-stations.txt
├── ghcnd-version.txt
├── readme.txt
└── status.txt

我正在与 pandas 合作进行数据分析。我对此感兴趣的主要原因是为了节省空间,数据集约为 25Gb。

如何将此数据集转换为单个 .hdf5 文件?

【问题讨论】:

  • hdf5 中的数据存储在数据集中,这些数据集可能是多维数组,用于保存结构化数据,例如 numpy 数组、pandas DataFrame、图像和电子表格。反正我还没有找到直接将纯文本或 tar.gz 文件放入 hdf5 的方法。但是,使用 Python,您可以将文件读入字符串并将其放入数据集中,如 docs.h5py.org/en/latest/strings.html 所示。 hdf5 文件是可能包含多个数据集的容器。
  • 我的目录结构具有误导性。我不需要包含 tar.gz 文件。我明白你在说什么。谢谢你的澄清。所以我真的需要一个 python 脚本来将所有文件转换成更结构化的数据,然后这可以通过 python 传递到 HDF5。
  • 为了更好地了解 HDF5 是什么,我建议从 hdfgroup.org/downloads/index.html 下载它,安装它并通过 hdfgroup.org/HDF5/Tutor/introductory.html 的介绍性教程。它附带的 Java GUI 使与 HDF5 交互变得容易,但是您不能将文件拖放到其中或任何类似的东西中。使用 Pandas 创建 HDF5 文件并为其添加 DataFrame 非常容易,这是将大量数据放入 HDF5 文件的好方法。
  • 你应该写一个答案让我接受,你们的cmets集体回答我的问题。
  • 我写了一个答案并添加了更多信息。

标签: python hdf5 pytables h5py


【解决方案1】:

HDF5 中的数据存储在数据集中,这些数据集可能是多维的,最多有 32 个维度,每个维度最多为无符号 64 位整数长度(列数),并且包含任意大小的数据类型,包括用于单个数据集的上限超过 16 EB。数据集旨在保存结构化数据,例如 numpy 数组、pandas DataFrames、图像和电子表格。我还没有找到将纯文本或 tar.gz 文件直接放入 HDF5 的任何方法。但是,使用 Python,您可以将文件读入字符串并将其放入数据集中,如 Strings in HDF5 所示。除了数据集,组是 HDF5 中的另一个主要对象类型,是数据集和其他组的容器。数据集和组类似于文件和目录(或文件夹),并为分层格式(如 Unix 文件系统)提供基础,其中可以使用以 / 开头的路径名访问对象。 HDF5 文件是可能包含多个数据集和组的容器,并且没有大小限制。

为了更好地了解 HDF5 是什么,我建议从 HDF5 Downloads 下载它和随附的实用程序以及 HDFView,安装所有内容,然后通过 Learning HDF5 with HDFView,这可以在 30 分钟内完成。 HDFView 是一个 Java GUI,可以轻松与 HDF5 交互,但是您不能简单地将文件拖放到其中,但可以将文件数据导入数据集。创建 HDF5 文件并使用 pandas 向其中添加 DataFrame 非常容易,这是将数据放入 HDF5 文件的好方法。下面是一个演示。有关 HDF5 的更多信息,您可以查看HDF5 TutorialsHDF5 Python Examples by APIAdditional HDF5 Python Examples 上列出的其他教程以及HDF5 for Python 上的 Python h5py 包文档。有关 pandas 的更多信息,10 Minutes to pandas 是一个很好的起点,接下来是 pandas Cookbook 的一系列代码示例和 Wes McKinney 的 Python for Data Analysis,这是自他发明和开发了大部分 Pandas 以来最好的关于 pandas 的教程并且是一位优秀的作者。

这是一个使用 pandas 创建 HDF5 文件、将 DataFrame 加载到其中并检索它的副本并将其存储在另一个变量中的示例:

In [193]: import pandas as pd

In [194]: frame = pd.read_csv('test.csv')

In [195]: frame
Out[195]: 
   a   b   c   d message
0  1   2   3   4     one
1  5   6   7   8     two
2  9  10  11  12   three

In [196]: type(frame)
Out[196]: pandas.core.frame.DataFrame

In [197]: hdf5store = pd.HDFStore('mydata.h5')

In [198] %ls mydata.h5
 Volume in drive C is OS
 Volume Serial Number is 5B75-665D

 Directory of C:\Users\tn\Documents\python\pydata

09/02/2015  12:41 PM                 0 mydata.h5
               1 File(s)              0 bytes
               0 Dir(s)  300,651,331,584 bytes free

In [199]: hd5store['frame'] = frame

In [200]: hdf5store
Out[200]: 
<class 'pandas.io.pytables.HDFStore'>
File path: mydata.h5
/frame            frame        (shape->[3,5])

In [201]: list(hdf5store.items())
Out[201]: 
[('/frame', /frame (Group) ''
    children := ['block0_values' (Array), 'block0_items' (Array), 'axis1' (Array), 'block1_items' (Array), 'axis0' (Array), 'block1_values' (VLArray)])]

In [202]: hdf5store.close()

现在演示从 mydata.h5 检索帧的能力:

In [203]: hdf5store2 = pd.HDFStore('mydata.h5')

In [204]: list(hdf5store2.items())
Out[204]: 
[('/frame', /frame (Group) ''
    children := ['block0_values' (Array), 'block0_items' (Array), 'axis1' (Array), 'block1_items' (Array), 'axis0' (Array), 'block1_values' (VLArray)])]

In [205]: framecopy = hdf5store2['frame']

In [206]: framecopy
Out[206]: 
   a   b   c   d message
0  1   2   3   4     one
1  5   6   7   8     two
2  9  10  11  12   three

In [207]: framecopy == frame
Out[207]: 
      a     b     c     d message
0  True  True  True  True    True
1  True  True  True  True    True
2  True  True  True  True    True

In [208]: hdf5store2.close()

【讨论】:

  • 感谢您的精彩回答。
猜你喜欢
  • 2019-08-07
  • 2014-03-07
  • 2018-11-19
  • 1970-01-01
  • 2015-08-16
  • 2015-04-14
  • 2015-10-07
  • 2022-11-12
  • 2019-07-20
相关资源
最近更新 更多