使用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文件

### 回答1: Python中可以使用netcdf4库来读取nc数据。具体步骤如下: 1. 安装netcdf4库 可以使用pip命令来安装netcdf4库,命令如下: ``` pip install netcdf4 ``` 2. 导入netcdf4库 在Python代码中导入netcdf4库,命令如下: ``` import netCDF4 ``` 3. 打开nc文件 使用netCDF4库中的Dataset函数打开nc文件,命令如下: ``` nc = netCDF4.Dataset('filename.nc', 'r') ``` 其中,'filename.nc'为nc文件的路径,'r'表示以只读方式打开文件。 4. 读取nc数据 可以使用nc.variables函数来读取nc文件中的变量,命令如下: ``` var = nc.variables['variable_name'] ``` 其中,'variable_name'为nc文件中的变量名。 5. 关闭nc文件 使用nc.close()函数关闭nc文件,命令如下: ``` nc.close() ``` 以上就是使用Python netcdf4库读取nc数据的基本步骤。 ### 回答2: Python是一种非常流行的编程语言,适用于许多数据分析和科学计算任务。NetCDF4是一种用于存储科学数据的文件格式,并提供了一套非常灵活的API,可以轻松地读写NetCDF文件。本文将介绍如何使用Python NetCDF4库读取NetCDF格式的数据。 NetCDF是Network Common Data Form的缩写,是一种自描述性的二进制数据格式,主要用于科学数据的存储和交换。对于大型、复杂数据集,NetCDF是一种很好的选择,因为它可以存储多维数据、元数据和处理历史记录。NetCDF文件具有自描述性,因为文件中包含有关数据和元数据的详细信息,包括数据维度、变量和属性。NetCDF文件还可以跨平台使用,因此在不同操作系统之间传输数据将更容易。 Python NetCDF4库是Python的一个扩展库,用于读取NetCDF格式的数据。几乎所有NetCDF文件都可以使用这个库来读取。 下面是使用Python NetCDF4库读取NetCDF格式的数据的详细步骤: 1.导入NetCDF4库: 首先,我们需要将Python NetCDF4库导入我们的程序中。我们可以使用以下代码完成此操作: import netCDF4 as nc 2.打开NetCDF文件: 我们需要打开NetCDF格式的文件,以便可以访问其中的数据。我们可以使用以下代码打开一个NetCDF文件: data = nc.Dataset('filename.nc') ‘filename.nc’是要打开的文件名,它应该是一个NetCDF格式的文件。 3.检查NetCDF文件的内容: 我们可以使用以下代码打印NetCDF文件中存储的变量和其尺寸: for var in data.variables: print(var, data.variables[var].dimensions) 这将显示NetCDF文件中所有变量的名称和它们的维数。 4.访问NetCDF变量: 我们可以使用以下代码访问NetCDF文件中的变量: variable = data.variables['variable_name'] ‘variable_name’是要访问的变量名称。 5.读取NetCDF变量的值: 我们可以使用以下代码读取NetCDF变量的所有值: data_array = variable[:] 6.关闭NetCDF文件: 在读取NetCDF文件中的数据后,我们应该将其关闭,以便释放内存资源。我们可以使用以下代码完成此操作: data.close() 上述代码是使用Python NetCDF4库读取NetCDF格式数据的基本步骤。 总的来说, python netcdf4是一种非常强大的工具,可用于处理天气、气候、海洋和地球物理科学数据等领域。它提供了许多函数和方法,可用于读取、写入和操作NetCDF格式的数据。通过了解以上步骤,您可以轻松地使用Python NetCDF4库读取并处理NetCDF格式的数据。 ### 回答3: NetCDF文件是一种常用的气象、海洋和地球物理场数据存储格式。PythonNetCDF4库提供了读取和处理NetCDF数据的功能。 使用NetCDF4库,首先需要导入该库: ``` import netCDF4 ``` 接着,可以使用`netcdf4.Dataset`函数打开NetCDF文件创建`Dataset`对象: ``` ncfile = netCDF4.Dataset('filename.nc', 'r') ``` 其中,`filename.nc`是要读取NetCDF文件名,`'r'`表示以只读模式打开文件使用`Dataset`对象,可以读取NetCDF文件中的变量、维度和属性等信息。例如,可以使用`variables`属性获取文件中的变量信息: ``` varnames = ncfile.variables.keys() for varname in varnames: var = ncfile.variables[varname] print(varname, var.dtype, var.dimensions, var.shape) ``` 此外,还可以使用`dimensions`属性获取文件中的维度信息: ``` dimnames = ncfile.dimensions.keys() for dimname in dimnames: dim = ncfile.dimensions[dimname] print(dimname, len(dim)) ``` 其中,`len(dim)`表示该维度的长度。 对于变量的具体数值,可以使用`[:]`或`getValue()`方法进行读取。例如,可以读取名为`temperature`的变量: ``` temperature = ncfile.variables['temperature'][:] # 或者 temperature = ncfile.variables['temperature'].getValue() ``` 此时,`temperature`变量即为NetCDF文件中名为`temperature`的变量的数值数组。 除此之外,NetCDF文件还可以包含一些属性。可以使用`attrs`属性获取属性信息: ``` attrnames = ncfile.ncattrs() for attrname in attrnames: attr = ncfile.getncattr(attrname) print(attrname, attr) ``` 其中,`ncattrs()`方法可以获取所有属性的名称,`getncattr(attrname)`方法可以获取指定属性的值。 最后,记得关闭NetCDF文件: ``` ncfile.close() ``` 本文介绍了使用PythonNetCDF4库读取NetCDF数据的基本方法,包括打开文件、获取变量、维度和属性信息、读取变量数值以及关闭文件等。这些方法可以帮助用户方便地进行数据抽取、处理和分析等操作。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值