Python处理HDF4与HDF5数据:从pyhdf到h5py的可视化实战
本文详解Python中处理HDF格式数据的两种主流方式:使用pyhdf解析HDF4及h5py解析HDF5。通过LIS/OTD闪电数据和OMI臭氧数据两个实例,展示如何提取变量、处理Groups层级结构,并利用Cartopy库绘制全球密度分布图,涵盖安装、读取及可视化全流程。
HDF格式简介与Python库选择
原文链接:https://blog.csdn.net/Fairy_Nan/article/details/105914203
HDF是一种自描述格式文件,广泛应用于科学数据的存储与分发。在气象领域,卫星数据常采用此格式,例如MODIS、OMI以及LIS/OTD等卫星产品。若需深入了解HDF格式的具体细节,建议通过搜索引擎查询相关资料。
本文主要基于Python环境,介绍如何处理HDF格式数据。Python提供了多种处理HDF数据的库:h5py用于处理HDF5格式(pandas中的read_hdf函数也基于此),pyhdf用于处理HDF4格式。此外,gdal库也能处理HDF、NetCDF及GRIB等格式的数据。
环境安装与配置
安装
首先,需要安装相关的Python库。

上述库均可通过conda包管理器进行安装。若conda无法直接安装,Windows用户可查找是否存在已打包的安装包,而Unix/Linux系统用户则可通过源码编译进行安装。
HDF4数据处理:基于pyhdf的闪电数据可视化
数据处理和可视化
以LIS/OTD卫星闪电成像数据为例,演示如何读取HDF4格式数据并进行绘图处理。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm, colors
import seaborn as sns
import cartopy.crs as ccrs
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from pyhdf.SD import SD, SDC
sns.set_context('talk', font_scale=1.3)
data = SD('LISOTD_LRMTS_V2.3.2014.hdf', SDC.READ)
lon = data.select('Longitude')
lat = data.select('Latitude')
flash = data.select('LRMTS_COM_FR')
# 设置colormap
collev= ['#ffffff', '#ab18b0', '#07048f', '#1ba01f', '#dfdf18', '#e88f14', '#c87d23', '#d30001', '#383838']
levels = [0, 0.01, 0.02, 0.04, 0.06, 0.1, 0.12, 0.15, 0.18, 0.2]
cmaps = colors.ListedColormap(collev, 'indexed')
norm = colors.BoundaryNorm(levels, cmaps.N)
proj = ccrs.PlateCarree()
fig, ax = plt.subplots(figsize=(16, 9), subplot_kw=dict(projection=proj))
LON, LAT= np.meshgrid(lon[:], lat[:])
con = ax.contourf(LON, LAT, flash[:, :, 150], cmap=cmaps, norm=norm, levels=levels, extend='max')
cb = fig.colorbar(con, shrink=0.75, pad=0.02)
cb.cmap.set_over('#000000')
cb.ax.tick_params(direction='in', length=5)
ax.coastlines()
ax.set_xticks(np.linspace(-180, 180, 5), crs=proj)
ax.set_yticks(np.linspace(-90, 90, 5), crs=proj)
lon_formatter= LongitudeFormatter(zero_direction_label=True)
lat_formatter= LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)

某月全球闪电密度分布 上述示例基于pyhdf进行HDF4格式数据处理和可视化,HDF4文件中包含的变量和属性获取方式见文末的Notebook,其中给出了 更详细的示例。
HDF5数据处理:基于h5py的臭氧数据读取
以下基于h5py读取HDF5格式数据,以OMI卫星O3数据为例:
import h5py
data = h5py.File('TES-Aura_L3-O3-M2005m07_F01_10.he5')
lon = data.get('/HDFEOS/GRIDS/NadirGrid/Data Fields/Longitude').value
lat = data.get('/HDFEOS/GRIDS/NadirGrid/Data Fields/Latitude').value
o3 = data.get('/HDFEOS/GRIDS/NadirGrid/Data Fields/O3').value
proj = ccrs.PlateCarree()
fig, ax = plt.subplots(figsize=(16, 9), subplot_kw=dict(projection=proj))
LON, LAT = np.meshgrid(lon[:], lat[:])
con = ax.contourf(LON, LAT, o3[10, :, :]*1e6, np.arange(0, 8.01, 0.1), vmin=0, vmax=8, cmap=cm.RdGy_r)
ax.coastlines()
ax.set_xticks(np.linspace(-180, 180, 5), crs=proj)
ax.set_yticks(np.linspace(-90, 90, 5), crs=proj)
lon_formatter = LongitudeFormatter(zero_direction_label=True)
lat_formatter = LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
cb = fig.colorbar(con, shrink=0.75, pad=0.02)
cb.set_ticks(np.arange(0, 8.01, 1))
cb.ax.tick_params(direction='in', length=5)
上述示例中使用类似unix中路径的方式获取相关变量,这在HDF格式数据中称为Groups。不同的组可以包含子组,从而形成类似嵌套的形式。详细的介绍可Google了解。

总结
到此这篇关于如何使用Python处理HDF格式数据及可视化问题的文章就介绍到这了,更多相关Python处理HDF格式数据内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













