使用python 的h5py 和netCDF4读取和创建.nc和.hdf文件

15 篇文章 5 订阅
13 篇文章 67 订阅

使用h5py 读取和写入hdf和nc文件

1 netCDF4创建文件不方便

上次比较系统的介绍了怎么使用netCDF4读取和写入.nc文件。

链接:使用python的netCDF4库读取.nc文件 和 创建.nc文件

但是上次介绍到过,使用netCDF创建.nc文件比较麻烦,比如要写入一个4维的数组,要先定义清楚,每一个维度对应的变量是什么。如下图,水汽q是4维的,分别对应 [时间,垂直层数,纬度,经度]这四个维度,而且还需要先知道变量的具体shape是多少,很麻烦。

在这里插入图片描述

2 h5py介绍

2.1 前言
  • .hdf和.nc文件是气象上常用的两种数据格式,存储方式基本一致。

  • 无论是 h5py还是netCDF4,都能独自解析这两种格式数据(建议使用netCDF4解析文件)。

  • 使用h5py,可以创建 .nc文件,也可以创建.hdf文件

  • h5py安装非常方便,直接pip安装

    pip install h5py
    
2.2 读取文件
2.2.1 可视化软件打开

在这里插入图片描述

存在两个文件 d.hdf 和 d.nc。使用可视化软件打开:如上图,两个文件内容和信息完全一致。

2.2.2 解析文件
  • h5py打开文件
import h5py

filename = 'D:/d.nc'
#filename = 'D:/d.hdf'

f1 = h5py.File(filename,mode = 'r')

#获取所有变量列表
all_vars = list(f1.keys())

#获取第4个变量的数据,并输出数据类型
data = f1[all_vars[3]][:]
print(type(data)) 
f1.close()

'''
output:
<class 'numpy.ndarray'>
'''
  • netCDF4打开文件
import netCDF4 as nc

filename = 'D:/d.nc'
#filename = 'D:/d.hdf'

f = nc.Dataset(filename,mode = 'r')

#获取所有变量列表
all_vars = list(f.variables.keys())

#获取第4个变量的数据,并输出数据类型
data = f.variables[all_vars[3]][:]
print(type(data))
f.close()

'''
output:
<class 'numpy.ma.core.MaskedArray'>
'''

Attention!

对比上面h5py和netCDF4的输出,我们发现两者输出的数据格式不一样:前者为 数组,后者为 mask(掩码)数组。而掩码数据可以很方便处理(跳过)缺失值,后面有机会再介绍 mask数组的应用。

也就是说,如果原本写入的数据 为mask数组,那么使用h5py读取的时候,会默认将mask数组变成np.array数组。而netCDF4会严格遵守写入时的规则。

综上,建议在解析.nc或者.hdf文件时,使用netCDF4来处理。

2.3 创建文件
2.3.1 创建变量、群组
import h5py
import netCDF4

#可以创建.nc或者.hdf,结构是一样的
filename = 'D:/haha/a.nc'
#filename = 'D:/haha/d.hdf'

#创建一个文件
f = h5py.File(filename,mode = 'w')

#eg1:单独创建变量,并写进属性信息(attr)
#创建变量,变量名为RH,数组为 5*5的,压缩方式选择'gzip'
#使用gzip(10M)可以比不使用gzip(32M) 文件存储大小降低3倍~4倍
Dataset = f.create_dataset('RH',data = np.random.randint(0,10,(5,5)),compression='gzip')

#写进一些这个变量的属性,如:单位,全称,fillvalue,shape等信息。
#这些信息可以帮助 后面的人更方便的 理解这个变量的意义。
Dataset.attrs['units'] = '%'
Dataset.attrs['long_name'] = 'Relative Humidity'
Dataset.attrs['shape'] = (5,5)
Dataset.attrs['_FillValue'] = '99999'


#eg2:创建群组,在该群组下写进变量,但不写入变量属性信息
#创建群组group1,在该群组下,有两个变量,分别为 Q1,Q2
group1 = f.create_group('group1')
group1['Q1'] = np.random.randint(0,10,(5,5))
group1['Q2'] = np.random.randint(0,10,(5,5))


#eg3:创建群组,在该群组下创建变量,并写进变量属性
#创建群组group2,名字为 wind,在该群组下,有两个变量,分别为 u,v
group2 = f.create_group('wind')

#创建变量u
Dataset1 = group2.create_dataset('u',data = np.random.randint(0,10,(5,5)),compression='gzip')
Dataset1.attrs['units'] = 'm/s'
Dataset1.attrs['long_name'] = 'u wind'
Dataset1.attrs['shape'] = (5,5)
Dataset1.attrs['_FillValue'] = '99999'

#创建变量v
Dataset2 = group2.create_dataset('v',data = np.random.randint(0,10,(5,5)),compression='gzip')
Dataset2.attrs['units'] = 'm/s'
Dataset2.attrs['long_name'] = 'v wind'
Dataset2.attrs['shape'] = (5,5)
Dataset2.attrs['_FillValue'] = '99999'

#一定要记得写完后,关闭文件。
f.close()

##注意:上面变量的值都为np.array数组,并没有经过 mask处理。可以使用 np.ma模块进行mask处理。
2.3.2 创建结果查看
  • 先使用可视化软件打开

在这里插入图片描述

看看我们刚才创建的文件,变量RH, 群组group1,群组group2:wind,和群组下的变量。我们看看u的属性(attr)和数值大小,是不是很清晰。

  • 使用netCDF4查看
f = nc.Dataset(filename)
#获取直接定义的变量名称,如RH,和RH的数值
all_vars = list(f.variables.keys())
RH_data = f.variables[all_vars[0]][:]
print(f.variables[all_vars[0]])

在这里插入图片描述

RH变量信息如上。

#获取群组名称,如 group1,wind
all_groups = list(f.groups.keys())
print(f.groups[all_groups[1]].variables)

#获取wind群组下的变量名称,u,v; 和 u的数值
group_vars = list(f.groups[all_groups[1]].variables.keys())
u_data = f.groups[all_groups[1]].variables[group_vars[0]][:]

f.close()

查看群组信息,并获取群组wind下的变量信息

在这里插入图片描述

最后生成的变量,如图。这里面的data默认也是 mask数组。

在这里插入图片描述

具体的介绍就到这里结束。

综上,使用h5py创建文件,使用netCDF4读取文件,是比较完美的搭配。

参考链接:

h5py官网

使用python的netCDF4库读取.nc文件 和 创建.nc文件

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值