歡迎您光臨本站 註冊首頁

如何使用Python處理HDF格式數據及可視化問題

←手機掃碼閱讀     zhang3221994 @ 2020-06-26 , reply:0

原文鏈接: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, 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,其中給出了 更詳細的示例。

以下基於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瞭解。

在這裡插入圖片描述


   


[zhang3221994 ] 如何使用Python處理HDF格式數據及可視化問題已經有233次圍觀

http://coctec.com/docs/python/shhow-post-239745.html