2015-09-02 86 views
3

我有一个数据集,我想将其转换为HDF5格式。 这是一个来自NOAA的数据集。 目录结构是这样的:将数据集转换为HDF5数据集

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

我与大熊猫数据分析工作。我对此感兴趣的主要原因是为了节省空间,数据集是〜25Gb。

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

+0

的数据存储在数据集中它们是可能是多方面的,是为了保持结构化数据如numpy的阵列,熊猫DataFrames,图像和电子表格阵列。我还没有找到直接将纯文本或tar.gz文件放入hdf5。但是使用Python,您可以将文件读入字符串并将其放入数据集中,如http://docs.h5py.org/en/latest/strings.html所示。 hdf5文件是可能有多个数据集的容器。 –

+0

我的目录结构具有误导性。我不需要包含* tar.gz *文件。我明白你在说什么。谢谢你澄清。所以我真的需要一个Python脚本来将所有文件转换为更多结构化的数据,然后这可以通过python传递到HDF5。 – wgwz

+0

为了更清楚地了解HDF5是什么,我建议从https://www.hdfgroup.org/downloads/index.html下载它,安装它并在https://www.hdfgroup.org上阅读介绍性教程。 /HDF5/Tutor/introductory.html。随附的Java GUI可以轻松与HDF5进行交互,但不能将文件拖放到其中或任何与其相近的文件中。用Pandas创建HDF5文件并向它们添加DataFrame非常简单,这是将大量数据放入HDF5文件的好方法。 –

回答

7

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

为了更清楚地了解HDF5是什么,我建议您下载它,并附上实用程序加上来自HDF5 Downloads的HDFView,全部安装,然后通过Learning HDF5 with HDFView,这可以在30分钟内完成。 HDFView是一种Java GUI,可以轻松与HDF5交互,但不能简单地将文件拖放到其中,但文件数据可以导入到数据集中。创建HDF5文件并向熊猫添加数据框非常简单,这是将数据放入HDF5文件的好方法。下面是一个示例。有关HDF5的更多信息,您可以查看HDF5 Tutorials,HDF5 Python Examples by API,Additional HDF5 Python Examples上列出的其他教程以及HDF5 for Python上的Python h5py软件包文档。有关熊猫的更多信息,10 Minutes to pandas是一个很好的开始,其次是pandas Cookbook的一系列代码示例,以及Wes McKinney的Python for Data Analysis,这是大熊猫最好的教程,因为他发明并开发了绝大多数大熊猫,是一位出色的作者。

下面是一个使用大熊猫创建HDF5文件,一个数据帧加载到其中并检索和存储它的一个副本在另一个变量的一个示例:

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:

在HDF5
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() 
+0

谢谢你的回答。 – wgwz