如何使用Python处理HDF格式数据及可视化问题


Posted in Python onJune 24, 2020

原文链接:https://blog.csdn.net/Fairy_Nan/article/details/105914203

HDF也是一种自描述格式文件,主要用于存储和分发科学数据。气象领域中卫星数据经常使用此格式,比如MODIS,OMI,LIS/OTD等卫星产品。对HDF格式细节感兴趣的可以Google了解一下。

这一次呢还是以Python为主,来介绍如何处理HDF格式数据。Python中有不少库都可以用来处理HDF格式数据,比如h5py可以处理HDF5格式(pandas中 read_hdf 函数),pyhdf可以用来处理HDF4格式。此外,gdal也可以处理HDF(NetCDF,GRIB等)格式数据。

安装

首先安装相关库

如何使用Python处理HDF格式数据及可视化问题

上述库均可以通过conda包管理器进行安装,如果conda包管理器无法安装,对于windows系统,可以查找是否存在已打包的安装包,而unix系统可以通过源码编译安装。

数据处理和可视化

以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)

如何使用Python处理HDF格式数据及可视化问题

某月全球闪电密度分布
上述示例基于pyhdf进行HDF4格式数据处理和可视化,HDF4文件中包含的变量和属性获取方式见文末的Notebook,其中给出了 更详细的示例。

以下基于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格式数据及可视化问题的文章就介绍到这了,更多相关Python处理HDF格式数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python类定义的讲解
Nov 01 Python
Python环境变量设置方法
Aug 28 Python
Python使用PDFMiner解析PDF代码实例
Mar 27 Python
利用Anaconda完美解决Python 2与python 3的共存问题
May 25 Python
Python正则捕获操作示例
Aug 19 Python
django之session与分页(实例讲解)
Nov 13 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
Sep 14 Python
Django如何与Ajax交互
Apr 29 Python
python cv2图像质量压缩的算法示例
Jun 04 Python
pytorch SENet实现案例
Jun 24 #Python
利用PyTorch实现VGG16教程
Jun 24 #Python
python安装读取grib库总结(推荐)
Jun 24 #Python
Pytorch mask-rcnn 实现细节分享
Jun 24 #Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 #Python
OpenCV+python实现实时目标检测功能
Jun 24 #Python
基于Python下载网络图片方法汇总代码实例
Jun 24 #Python
You might like
PHP实现获取图片颜色值的方法
2014/07/11 PHP
浅谈json_encode用法
2015/03/05 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
学习ExtJS Window常用方法
2009/10/07 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
JavaScript 实现打印,打印预览,打印设置
2014/12/30 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
Python open读写文件实现脚本
2008/09/06 Python
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
python使用turtle绘制分形树
2018/06/22 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
python导入坐标点的具体操作
2019/05/10 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
应届生护士求职信
2013/11/01 职场文书
关于期中考试的反思
2014/02/02 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL