参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.html
https://confluence.ecmwf.int/display/ECC/GRIB+examples
https://confluence.ecmwf.int/download/attachments/97363968/eccodes_grib_python_2018.pdf

关于Python读取GRIB格式数据,Kallan写过一篇“基于Python的Grib数据可视化”,介绍了如何利用pygrib读取GRIB数据。但是pygrib所依赖的GRIB_API已不再更新,GRIB_API的开发者转为开发ecCodes,因此研究利用ecCodes的Python API读取GRIB数据。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

此外,ecCodes自2.10.0版本以后,支持Python 3接口。可在CMake编译时,指定‘-DPYTHON_EXECUTABLE=/usr/bin/python3’选项,开启对Python3 的支持。

PS:编译完成后,还需要设置eccodes库路径(可参考此方法:设置python路径 - 一步一脚印 ,建议用其中第二种方法,从.pth文件中添加路径),否则可能运行时会出现"NameError: name ‘xxx’ is not defined"错误。

 

Python读取GRIB文件的流程和fortran类似,只是函数调用方式不一样。大致思路如下:

基本解码流程

1. 指定打开方式(“读”或“写”),打开一个或多个GRIB文件;

2. 根据不同加载方式,加载一个或多个GRIB messages到内存
  有两种函数:codes_grib_new_from_file 和 codes_new_from_index。调用后会返回一个唯一的identifier,用于对已加载的GRIB messages进行操纵。

3. 调用codes_get函数对已加载的GRIB messages进行解码; (可以解码需要的数据)

4. 释放已经加载的GRIB messages
  codes_release  

5. 关闭打开的 GRIB 文件.

——引自  ecCodes 学习 利用ecCodes fortran90 api对GRIB文件进行读写

 

下面是一段读取GRIB数据的示例代码

#!/usr/bin/env python
# -*- coding:utf-
from eccodes import *

#打开文件
ifile = open('example.grib')
while 1:
    igrib = codes_grib_new_from_file(ifile)
    if igrib is None: break

    #从加载的message中解码/编码数据
    date = codes_get(igrib,"dataDate")
    levtype = codes_get(igrib,"typeOfLevel")
    level = codes_get(igrib,"level")
    values = codes_get_values(igrib)
    print (date,levtype,level,values[0],values[len(values)-1])

    #释放
    codes_release(igrib)
ifile.close()

 

注:Python版本的函数与Fortran版本类似,所有函数列表参考http://download.ecmwf.int/test-data/eccodes/html/namespaceec_codes.html

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄