HDF(Hierarchical Data Format),翻译一下就是层次数据格式,其实就是一个高级文件夹,或一个文件系统。
一、group、dataset
h5文件中有两个核心的概念:组“group”和数据集“dataset”。 一个h5文件就是 “dataset” 和 “group” 二合一的容器。
   dataset :简单来讲类似数组组织形式的数据集合,一个类似n维的矩阵。
   group:包含了其它 dataset(数组) 和 其它 group ,像字典一样工作。
  
关于group和dataset:

    path =r"C:\Users\rustr\Desktop\test.h5"arr1 = np.array([(1,2,3),(4,5,6)])arr2 =  np.array([(2,4,6),(8,9,10)])f = h5py.File(path,'w')g1=f.create_group("\data1")g2=f.create_group("\data2")g3 =f.create_group("\data3")g1.create_dataset("arr1",data =arr1)g2.create_dataset("arr1",data =arr2)print("f keys:",f.keys())print("f keys len:", len(f.keys()))# 如何判断 某group是否存在?if "\data1" in f:print("\\data1 is a existing group!" )# 如何判断某dataset是否存在?if "arr1" in f["\data1"]:print("arr1 is a existing dataset!")for p in f: # groupprint("group p value:",f[p]) # get group valueprint("p:",p,"  ,f[p] keys: ",f[p].keys(),"  len:",len(f[p].keys()))for q in f[p]: # datasetprint("=>")print("dataset:", q," value:",f[p][q][()]) # get dataset valuef.close()

输出如下:

\data1 is a existing group!
arr1 is a existing dataset!
group p value: <HDF5 group “/\data1” (1 members)>
p: \data1 ,f[p] keys: <KeysViewHDF5 [‘arr1’]> len: 1
=>
dataset: arr1 value: [[1 2 3]
[4 5 6]]
group p value: <HDF5 group “/\data2” (1 members)>
p: \data2 ,f[p] keys: <KeysViewHDF5 [‘arr1’]> len: 1
=>
dataset: arr1 value: [[ 2 4 6]
[ 8 9 10]]
group p value: <HDF5 group “/\data3” (0 members)>
p: \data3 ,f[p] keys: <KeysViewHDF5 []> len: 0

二、python 中库:PyTables和h5py

Python中的HDF5库通常有PyTables和h5py。

h5py提供了一种直接而高级的HDF5 API访问接口;

PyTables则抽象了HDF5的许多细节以提供多种灵活的数据容器、表索引、查询功能等支持。比如可以进行where索引。

pandas有一个最小化的类似于字典的HDFStore类,它通过PyTables存储pandas对象。

在h5的文件存储中,storer(fixed format)和table(more scalable random-access and query abilities)格式的存储,在读写也是存在着很大的差异。前者的速度快,但是更占空间。后者的速度要慢一些。

从方便程度来看,pandas内置的方法对df类型的数据封装较好,应用最为方便,但有人认为速度较差;从速度来看,h5py最优,但在具体数据处理上更复杂。

在2015年SciPy上,来自PyTables,h5py,HDF Group,Pandas以及社区成员的开发人员坐下来讨论如何使Python和HDF5的协作更加精简和更易于维护。

这个是未来几个库之间关系的设想:

# -*- coding: utf-8 -*-import h5py
import pandas as pd
import numpy as np
import time as t# 把日期分解为int 数组,提高效率;
# 把代码存为int,建立解析关系
path =r'C:\Users\rustr\Desktop\000001.XSHE.csv'
path_h5 =r'C:\Users\rustr\Desktop\000001.h5'
path_h5_2 =r'C:\Users\rustr\Desktop\000001_2.h5'def to_hdf_test():t0= t.time()df1 = pd.read_csv(path,  encoding='gb18030')print('csv=>df read cost time:',t.time()-t0,'s')df2 = df1;print('df1的格式:',type(df1))print('df 的行',df1.shape[0],' 列:',df1.shape[1])print("hdf5=>write")t1 =t.time()df1.to_hdf(path_h5,'df',mode='w', format='table')print("to_hdf write=> cost time :",t.time()-t1,'s')t2=t.time()print("hdf5=>append")df2.to_hdf(path_h5, 'data', append=True)print("append mode: to_hdf write=> cost time :",t.time()-t2,'s')t3 =t.time()print("hdf5=>read")df3 = pd.read_hdf(path_h5, 'data')print("read hdf5 =>cost time:",t.time()-t3,'s')print('type df3: ',type(df3))#print(df3)def hdf5Store_test():# read csvt0 =t.time()df = pd.read_csv(path,  encoding='gb18030')print('read csv cost time:',t.time()-t0,'s')print('df 的行',df.shape[0],' 列:',df.shape[1])# write# way 1print("hdf5=>write")store = pd.HDFStore(path_h5_2)store['data'] = dfstore.close()# way 2 :appendprint("hdf5=>write")store = pd.HDFStore(path_h5_2)for i in range(2):store.append('data', df) #追加的形式,label为data,也可以取别的名print('hdf5 append work is close')store.close()# readprint('hdf5 => read')t1= t.time()store = pd.HDFStore(path_h5_2)data = store['data']store.close()print('read hdf5 cost time:',t.time()-t1,'s')print('hdf5 data 的行',data.shape[0],' 列:',data.shape[1])print('type data:',type(data))#print(data)def h5py_test():# hdf5 象是文件夹方式# 比如'\files\IC.csv'# dataset是数据元素的一个多维数组以及支持元数据(metadata)# n = 10000 #重复次数now_time_str = '2019-08-18 13:53:00'.encode('utf-8')*nnow_time_int = np.array([2019, 8, 18,13.,53,0])*npath1 = r'C:\Users\rustr\Desktop\test1.h5'path2 = r'C:\Users\rustr\Desktop\test2.h5'# 写入HDF5# 1、strprint('now is writing hdf5 file test')t1 = t.time()f1 = h5py.File(path1,'w')#f.create_dataset('/group/time_str', data=now_time_str) # 方式1#放在mygroup下,以dataset存放f1['/mygroup/time_str'] = now_time_str                     #方式2# 打个标识f1['/mygroup/time_str'].attrs["string"] = 'string'f1.close()print('dt 写入hdf5 =>字符串花时:',t.time()-t1,'s')# 2、int ; 不设groupt2 = t.time()f2 = h5py.File(path2,'w')f2.create_dataset('time_int', data=now_time_int)#f2['time_int'] = now_time_intf2.close()print('dt 写入hdf5 =>int花时:',t.time()-t2,'s')# 读取HDF5print('now is reading hdf5 file test......')# str_t1 =t.time()for i in range(100):g1 = h5py.File(path1,'r')time_str_dataset =g1[r'/mygroup/time_str'] # datasettime_str = time_str_dataset[()] # 从dataset中取出元素#time_str = g1[r'/mygroup/time_str'].value => depreciated#print(time_str)g1.close()print('dt str type => read hdf5=> cost:',t.time()-_t1,'s')#int_t2 =t.time()for i in range(100):g2 = h5py.File(path2,'r')time_int_dataset = g2['time_int'] #取出datasettime_int = time_int_dataset [()] #取出value#print(time_int)g2.close()print('dt int type => read hdf5=> cost:',t.time()-_t2,'s')

关于不同的字符串和数值型的读写比较:

to_hdf_test()
csv=>df read cost time: 0.2543447017669678 s
df1的格式: <class ‘pandas.core.frame.DataFrame’>
df 的行 116638 列: 14
hdf5=>write
to_hdf write=> cost time : 0.09382462501525879 s
hdf5=>append
append mode: to_hdf write=> cost time : 0.09407901763916016 s
hdf5=>read
read hdf5 =>cost time: 0.12476396560668945 s
type df3: <class ‘pandas.core.frame.DataFrame’>

pandas的read_csv的速度也让我很吃惊。

h5py_test()
now is writing hdf5 file test
dt 写入hdf5 =>字符串花时: 0.001994609832763672 s
dt 写入hdf5 =>int花时: 0.001024007797241211 s
now is reading hdf5 file test…
dt str type => read hdf5=> cost: 0.051293134689331055 s
dt int type => read hdf5=> cost: 0.03966259956359863 s

可以看出,hdf5读的速度非常快,优势非常明显。

python: pandas 、dataframe 与hdf5相关推荐

  1. python pandas DataFrame 替换 NaN 值 和 删除 NaN 所在的行。

    python pandas DataFrame 替换 NaN 值 和 删除 NaN 所在的行. import pandas as pd import numpy as np df1 = pd.Data ...

  2. python pandas DataFrame 查找NaN所在的位置

    python pandas DataFrame 查找 NaN 所在的位置 import pandas as pd import numpy as np df1 = pd.DataFrame({'日期' ...

  3. python pandas dataframe 列 转换为离散值

    python pandas dataframe 列 转换为离散值 import pandas as pd import numpy as np df1 = pd.DataFrame({'日期': [' ...

  4. python pandas DataFrame 排序

    python pandas DataFrame 排序 import pandas as pd import numpy as np df1 = pd.DataFrame({'日期': ['2021-7 ...

  5. python pandas DataFrame 字符串转日期格式

    python pandas DataFrame 字符串转日期格式 import pandas as pd import numpy as np df1 = pd.DataFrame({'日期': [' ...

  6. python pandas DataFrame 数据替换

    python pandas DataFrame 替换 import pandas as pd import numpy as np df1 = pd.DataFrame({'日期': ['2021-7 ...

  7. python pandas DataFrame 转置

    python pandas DataFrame 转置 import pandas as pd df1 = pd.DataFrame({'日期': ['2021-7-2', '2021-8-2', '2 ...

  8. python pandas dataframe 行列选择,切片操作 原创 2017年02月15日 21:43:18 标签: python 30760 python pandas dataframe

    python pandas dataframe 行列选择,切片操作 原创 2017年02月15日 21:43:18 标签: python / 30760 编辑 删除 python pandas dat ...

  9. Python pandas.DataFrame.combine_first函数方法的使用

    Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.Pandas提供了大量能使我们快速 ...

  10. Python pandas.DataFrame.tz_localize函数方法的使用

    Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.Pandas提供了大量能使我们快速 ...

最新文章

  1. R语言在ggplot中使用变量指定柱状图的名称实战
  2. 什么是java序列化_什么是Java序列化?为什么序列化?序列化有哪些方式?
  3. 干货:TensorFlow1.2~2.1各个GPU版本CUDA和cuDNN对应版本整理
  4. Lesson_7 上课笔记_1 ----static关键字和导包
  5. s2-045 java_S2-045漏洞初步分析
  6. Access-Ctrol-Allow-Headers:*兼容问题导致的跨域失败
  7. 笔记:git常用操作,git使用,git命令行
  8. String的按值传递,java传参都是传值
  9. 数学归类你倾向于哪一方?
  10. react-native this使用笔记
  11. Android的SharedPreferences存取String和List<String>类型(在Activity和Fragment内使用)
  12. Android-JNI开发系列《四》Native-Crash定位
  13. 窗体最小化时隐藏窗体_delphi基础
  14. 长见识了: 一篇文章带你看懂 硬盘数据恢复软件的原理
  15. 相关系数excel_利用【相关系数】理解数据之间的关系
  16. android 获取手机内存及SD卡内存可用空间
  17. Java8 根据身份证号获取年龄
  18. Oracle开发 之 主-外键约束FK及约束的修改
  19. 计算机在表格底部插入一空行怎么弄,简单高效的Excel技巧,表格隔行插入空行,这两种方法很实用...
  20. mysql的查询分析工具下载_万能数据库查询分析器(ODBC数据库查询分析工具)V7.03 最新版...

热门文章

  1. 10分钟带你光速入门运维工具之-Puppet
  2. jquery dropload
  3. uva 11991 - Easy Problem from Rujia Liu?(STL)
  4. Quartz-第一篇 认识Quartz
  5. std::string std::wstring 删除最后元素 得到最后元素
  6. java lock -----锁
  7. mysql在故障切换时的事件调度器注意事项
  8. [Fatal Error] :3:13: Open quote is expected for attribute {1} associated with an element type i...
  9. Lattice Diamond 的学习之新建工程
  10. 批处理命令启动和关闭tomcat