如何使用Python處理HDF格式資料及視覺化問題
阿新 • • 發佈:2020-06-28
原文連結: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等)格式資料。
安裝
首先安裝相關庫
上述庫均可以通過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,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,其中給出了 更詳細的示例。
以下基於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,subplot_kw=dict(projection=proj)) LON,LAT = np.meshgrid(lon[:],lat[:]) con = ax.contourf(LON,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,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,pad=0.02) cb.set_ticks(np.arange(0,1)) cb.ax.tick_params(direction='in',length=5)
上述示例中使用類似unix中路徑的方式獲取相關變數,這在HDF格式資料中稱為Groups。不同的組可以包含子組,從而形成類似巢狀的形式。詳細的介紹可Google瞭解。
總結
到此這篇關於如何使用Python處理HDF格式資料及視覺化問題的文章就介紹到這了,更多相關Python處理HDF格式資料內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!