参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf.int/display/ECC/GRIB+exampleshttps://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_release5. 关闭打开的 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
下面是一段读取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