今天說hdf5資料,hdf5與之前提到的hdf4資料(可參考這)是同樣的資料儲存格式,只不過hdf5簡化hdf4的資料結構,讓儲存的方式更有效率。
由於目前我手邊沒有hdf5的資料,故從氣象局開放資料下載hdf4的資料,然後轉成hdf5。
向日葵八號衛星觀測資料-頻道13亮溫(10.4um)的hdf4檔名為O-A0043-004.hdf,我利用工具將其轉換為O-A0043-004.h5。
接下來就要開始讀取了,我這邊用h5py套件解hdf5的資料,安裝方式如下
conda install -c conda-forge h5py
或
pip3 install h5py
安裝完成後,就可以開始讀取囉
import h5py
h5pydata = h5py.File("day18/O-A0043-004.h5","r")
#看資料屬性,主要是看有哪些資本資料,這邊的基本資料就是非格點資料。
#譬如這一份檔案是有哪個程式語言寫的或者本身的檔名等資訊
for qqkey,qqval in h5pydata.attrs.items():
print(qqkey,qqval)
上面的結果截圖(部分)如下,可以看到黃色螢光筆的地方,就是我提到這份資料是用哪個程式語言撰寫及原本的檔名。
這一份資料原始檔案是由Fortran90撰寫,原始檔名為clavrx_H08_20221002_0700_asia.level2.hdf
這也證明這一份hdf5原本是hdf4格式。
那格點資料要怎麼得到呢?
#格點資料被儲存成字典的方式
for varname, vargridvalue in h5pydata.items():
print(varname,",,, ", vargridvalue)
會得到如下圖,總共有5個key,分別為latitude, longitude, pixel_elements_along_scan_direction, scan_lines_along_track_direction, temp_10_4um_nom。而value的部分,可以知道資料格點的格點數及資料型別,以latitude為例,<HDF5 dataset "latitude": shape (1478, 1928), type ">f4">,代表總共有1478*1928個格點,資料型別為">f4",代表1個格點的值為bigeddien搭配4bytes的浮點數。
當知道key之後,就可以得到value,然後還記得之前讀hdf4的時候,每一個key對應的value都有scale_factor 跟add_offset,所以也必須要找出來。
tempfake = h5pydata["temp_10_4um_nom"][:]
scalfct = h5pydata["temp_10_4um_nom"].attrs["scale_factor"]
add_oft = h5pydata["temp_10_4um_nom"].attrs["add_offset"]
realtemp = tempfake * scalfct + add_oft
透過上面的轉換,就可得到正確數值囉
視覺化
另外呢,也可以用之前提到的gdal套件讀取hdf5格式的資料。明天說一下為什麼不同套件可以解相同資料。