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

本文对比了h5py和netCDF4在处理.hdf和.nc文件上的优劣,详细介绍了如何使用h5py创建和解析这两种文件格式,包括变量、群组的创建及属性设置。并推荐在创建文件时使用h5py,读取文件时使用netCDF4。

使用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的输出,我们发现两者输出的数据格式不一样:前者为 数组,后者为 m

<think>嗯,用户想了解如何使用HDF5读取netCDF4文件,并设置坐标参数单位。首先,我需要确认HDF5netCDF4之间的关系。NetCDF4是基于HDF5格式构建的,所以理论上可以用HDF5库来处理,但可能不如直接使用netCDF4库方便。用户可能误解了这一点,或者有特定的需求必须用HDF5库。 接下来,用户提到设置坐标参数单位,这在netCDF文件中通常通过变量属性维度来实现。比如,纬度变量可能有“units”属性设置为“degrees_north”。如果用HDF5直接操作,需要了解如何创建这些属性维度。 然后,我需要回忆HDF5 Python库(h5py)的基本操作。打开文件读取数据集、设置属性等。但处理netCDF4可能需要注意一些特定的约定,比如维度名称、变量属性是否符合CF约定。 用户的问题可能涉及到如何正确映射HDF5的结构到netCDF4的结构,或者如何在HDF5中模拟netCDF4的元数据设置。另外,可能用户需要知道如何读取现有的netCDF4文件并用HDF5库来修改坐标参数,或者创建新的文件。 还要考虑到用户可能遇到的常见问题,例如单位设置不正确导致绘图工具无法识别,或者坐标变量与数据变量的维度不匹配。这时候需要示例代码来演示正确的步骤。 另外,用户之前的问题中引用了matplotlib的代码,可能他们最终目的是将读取的数据进行可视化,所以正确的坐标设置对绘图很重要。需要确保在回答中提到的步骤能够支持后续的数据可视化,比如单位、坐标轴的标签。 可能需要比较使用netCDF4h5py库的差异,指出如果只是为了处理netCDF4文件,直接使用netCDF4库会更方便,但用户明确要求用HDF5,所以必须用h5py来实现。 最后,生成相关问题时要覆盖可能的后续疑问,比如性能优化、异常处理、其他元数据设置等。</think>### HDF5读取netCDF4文件及坐标设置方法 #### 1. 文件读取基础 由于netCDF4基于HDF5格式实现,可以使用`h5py`库直接读取。但需要注意netCDF4的特殊约定(如CF元数据标准): ```python import h5py with h5py.File('example.nc', 'r') as f: # 读取数据集 temp = f['/group1/temperature'][:] # 读取维度坐标 lon = f['/group1/lon'][:] lat = f['/group1/lat'][:] ``` #### 2. 坐标参数设置要点 在HDF5中设置坐标参数需通过**属性(attributes)**实现: ```python with h5py.File('new_file.h5', 'w') as f: # 创建维度数据集 dset_lon = f.create_dataset("lon", data=np.arange(-180,180)) dset_lat = f.create_dataset("lat", data=np.arange(-90,90)) # 设置坐标属性 dset_lon.attrs['units'] = 'degrees_east' # 经度单位 dset_lat.attrs['units'] = 'degrees_north' # 纬度单位 dset_lon.attrs['long_name'] = 'longitude' # 坐标名称 ``` #### 3. 数据与坐标关联 通过`dims`参数建立维度关联: ```python with h5py.File('data.h5', 'w') as f: # 创建维度 time_dim = f.create_dataset("time", data=np.arange(0,365)) # 创建三维数据变量 dset = f.create_dataset("precipitation", shape=(365, 180, 360), dtype='f4', chunks=(30, 90, 180), dims=("time", "lat", "lon")) # 明确维度顺序 ``` #### 4. 单位系统配置 推荐使用CF标准单位定义: ```python # 设置时间坐标示例 dset_time = f.create_dataset("time", data=np.arange(0,8760)) dset_time.attrs['units'] = 'hours since 2020-01-01 00:00:00' # CF时间格式 dset_time.attrs['calendar'] = 'gregorian' # 日历系统 ``` #### 5. 完整示例 ```python import h5py import numpy as np with h5py.File('ocean_data.h5', 'w') as f: # 创建坐标维度 lon = f.create_dataset("lon", data=np.linspace(-179.5, 179.5, 360)) lat = f.create_dataset("lat", data=np.linspace(-89.5, 89.5, 180)) time = f.create_dataset("time", data=np.arange(0, 365)) # 设置坐标属性 for dset, attrs in [(lon, {'units': 'degrees_east', 'axis': 'X'}), (lat, {'units': 'degrees_north', 'axis': 'Y'}), (time, {'units': 'days since 2023-01-01', 'axis': 'T'})]: for k, v in attrs.items(): dset.attrs[k] = v # 创建数据变量 temp = f.create_dataset("temperature", shape=(365, 180, 360), dims=("time", "lat", "lon")) temp.attrs['units'] = 'degree_C' temp.attrs['long_name'] = 'Sea Surface Temperature' ``` #### 验证建议: 1. 使用`ncdump -h`命令验证文件结构 2. 通过xarray测试数据可读性: ```python import xarray as xr ds = xr.open_dataset('ocean_data.h5', engine='h5netcdf') print(ds) ```
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值