参考 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数据。

此外,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 文件.

顺序访问方式:

大致思路:

-> codes_open_file 

-> codes_grib_new_from_file -> codes_get -> codes_release

     …

-> codes_grib_new_from_file -> codes_get-> codes_release 

-> codes_close_file

索引访问方式(通常比顺序访问快):

注意,eccodes中的index文件(后缀为.idx)与GrADS中后缀为.idx的文件不能通用!

大致思路:

-> codes_index_create(从grib文件创建index) 或 codes_index_read(读取已有index)

-> codes_index_select 选取键值

-> codes_new_from_index -> codes_get -> codes_release

     …

-> codes_new_from_index -> codes_get -> codes_release

-> codes_index_release

——引自  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