python读取hdf5文件并转为nc/matlab查看hdf5信息并输出——以北极AMSR2海冰密集度数据为例(h5py、hdf5disp)
HDF 是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要所建立一种文件格式。主要用来存储与分发不同科学数据。在研究过程中,我们往往需要多种数据,而数据与数据间有着不同的特性、来源、信息,将不同格式与来源的数据进行存储交换,并给予对应的数据说明,便是HDF格式文件解决的问题。HDF格式一般有HDF4/HDF5,目前许多卫星遥感数据便以HDF5的格式储存。
什么是HDF5?它的特点?
HDF 是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要所建立一种文件格式。主要用来存储与分发不同科学数据。
在研究过程中,我们往往需要多种数据,而数据与数据间有着不同的特性、来源、信息,将不同格式与来源的数据进行存储交换,并给予对应的数据说明,便是HDF格式文件解决的问题。
HDF格式一般有HDF4/HDF5,目前许多卫星遥感数据便以HDF5的格式储存。
HDF5的结构
有人将HDF文件称作“数据之书”,这是个很贴切的比喻,HDF5的格式正像书一样,有着目录(group)、章节(Dataset)、段落(Attributes)。
一个HDF5文件有两个Object:group与Dataset。
GROUP类似于一个书的章节目录,不同GROUP包含着不同Dataset,而同时,不同的Data又有不同的数据说明,这就是属性(Attributes)。
''' h5py_example.hdf5 file structure
+-- '/'
| +-- group "bar1"
| | +-- group "car1"
| | | +-- None
| | |
| | +-- dataset "dset1"
| |
| +-- group "bar2"
| | +-- group "car2"
| | | +-- None
| | |
| | +-- dataset "dset2"
| |
| +-- dataset "dset"
| | +-- attribute "myAttr1"
| | +-- attribute "myAttr2"
| |
|
'''
h5py读取HDF5
下面给出一些h5py读取HDF5的基本语句:
import h5py
filepath='F:/AMSR/spring/'
h5list=glob.glob(filepath+'/*.he5')
f1 = h5py.File(h5list[1],mode = 'r')
#获取所有变量列表
all_vars = list(f1.keys())
其中,all_vars里会给出所有的GROUP名称。keys
可以返回所有主键,即名称,使用items
则可以查看groups下的目录:
print(list(hdf.items()))
返回:
[('ADDITIONAL', <HDF5 group "/HDFEOS/ADDITIONAL" (1 members)>), ('GRIDS', <HDF5 group "/HDFEOS/GRIDS" (2 members)>)]
通过这样逐层查看hdf5文件的信息,我们就可以找到需要的Dataset目录,并将其提取。
查看hdf5信息并保存
上面的方法固然可以查看信息,但是,当hdf5文件内容复杂时,这样的逐层查看十分耗时,
在python中我没有找到可以一口气显示hdf5信息的方法,于是我先用了matlab里的h5disp
函数获取信息,并输出:
diary('h5info.txt');
diary on;
h5disp('AMSR_U2_L3_SeaIce25km_B04_20180902.he5');
diary off;
输出:
读取hdf5数据并转为nc
通过将HDF5数据信息打印,我们可以比较快速的找到对应数据的目录并读取:
lat=np.array(f1['/HDFEOS/GRIDS/NpPolarGrid25km/lat'])
lon=np.array(f1['/HDFEOS/GRIDS/NpPolarGrid25km/lon'])
sic=np.array(f1['/HDFEOS/GRIDS/NpPolarGrid25km/Data Fields/SI_25km_NH_ICECON_DAY'])
转为nc文件:
f=nc.Dataset('F:/AMSR/sic.nc','w',format = 'NETCDF4')
f.createDimension('lat',384 )
f.createDimension('lon', 448)
f.createVariable('sic', np.int32,('lon','lat'))
f.variables['sic'][:]=sic
f.close()
完成
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)