HDF5

阅读: 6237     评论:4

HDF5是一个备受好评的文件格式,广泛用于存储大量的科学计算数组。很多数据分析的实际工作中困难都在于I/O密集,而不是CPU密集,使用HDF5这样的工具可以大大加速你的应用。它以C库的形式提供,并且具有许多其它语言的接口,包括Java、MATLAB和Python。HDF5中的HDF代表分层数据格式。每个HDF5文件可以存储多个数据集并且支持元数据。支持多种压缩模式的即时压缩,使得重复模式的数据可以更高效地存储。HDF5适用于处理不适合在内存中存储地超大型数据,可以使你高效读写大型数据的一小块。

要注意的是HDF5并不是数据库,它是一种适合一次写入多次读取的数据集。尽管数据可以在任何时间添加到文件中,但如果多个写入者持续写入,文件可能会损坏。

在外部,可以通过使用PyTables或h5py等库直接访问HDF5文件,但Pandas提供了一个高阶的接口,可以简化存储过程。

Pandas使用HDFStore类来实现这一功能,类似字典一样的工作方式:

In [90]: df = pd.DataFrame({'a':np.random.randn(100)})  # 有100行

In [91]: df.head() # 看看前5行
Out[91]:
          a
0 -0.917062
1  0.797327
2  0.659787
3 -0.779638
4  0.550464

In [92]: store = pd.HDFStore('mydata.h5') # 生成HDF5文件

In [93]: store['obj1'] = df  # 以类似字典的方式,向文件里写入内容

In [94]: store['obj1_col'] = df['a'] # 再写一点

In [95]: store   # 看看信息,在当前工作目录下,你可以找到这个文件
Out[95]:
<class 'pandas.io.pytables.HDFStore'>
File path: mydata.h5

既然是类似字典的工作方式,那当然也可以像字典那样索引数据:

In [97]: store['obj1']
Out[97]:
           a
0  -0.917062
1   0.797327
2   0.659787
3  -0.779638
4   0.550464
..       ...
95 -2.042226
96  1.286631
97  0.487709
98 -0.202580
99  1.619085

[100 rows x 1 columns]

HDFStore支持两种工作模式,‘fixed’和‘table’。table的速度更慢,但支持一种类似数据库SQL语言的查询操作:

In [98]: store.put('obj2',df,format='table') # put是赋值的显式版本,允许我们设置其它选项

In [99]: store.select('obj2', where=['index >=10 and index <= 15'])  # 类似SQl语言的查询操作,要注意空格的位置
Out[99]:
           a
10 -1.430696
11 -0.616732
12 -0.643991
13 -0.004270
14  0.797136
15 -0.175095

In [100]: store.close() # 关闭文件

除此之外,Padas还提供了以上操作的快捷方式:

In [101]: df.to_hdf('mydata.h5','obj3', format='table')

In [102]: pd.read_hdf('mydata.h5', 'obj3' ,where=['index < 5'])
Out[102]:
          a
0 -0.917062
1  0.797327
2  0.659787
3 -0.779638
4  0.550464

 JSON和Pickle EXCEL文件 

评论总数: 4


点击登录后方可评论

用pd.HDFStore方式打开的文件默认模式是"a",所以不能用pd.read_hdf操作该文件,除非先调用store.close()方法关闭该文件。另外,用字典方式向hdf文件写内容是fixed工作模式,store.select方法里不能用where参数,否则会报错。



pd.read_hdf()报错:ValueError: cannot set WRITEABLE flag to True of this array 怎么解决?



明白了,写的时候需要指定format参数



写的时候不指定format参数也行,只不过默认是fixed模式