python读取grib数据

windows系统下安装的Ubuntu18.04子系统,anaconda

用到的数据是ec的预报数据,第一步解压
这部分参考博客1
博客2
解压文件夹下所有文件,需要循环遍历一下,参考上面的博客2,数据多的时候很方便

#conda install bzip2 安装库
import bz2
pp = r'/mnt/f/2022/data/0601/W_NAFP_C_ECMF_20180601054641_P_C1D06010000060100001.bz2'
with open('/mnt/f/2022/data/test.grib', 'wb') as new_file, bz2.BZ2File(pp, 'rb') as file:for data in iter(lambda: file.read(100 * 1024), b''):new_file.write(data)

解压完毕,开始读取,走了很多弯路
第一种方法:xarray读取
安装库以及依赖库

conda install -c conda-forge xarray
conda install -c conda-forge eccodes
conda install -c conda-forge cfgrib

第一次读取

import xarray as xr
data=xr.open_dataset('/mnt/f/2022/data/test.grib',engine='cfgrib')

报错如下,跟网上的报错不一样,比如multiple values for unique key, try re-open the file with one of…
以及报错
这种报错可参考上面的链接,报错会提示,然后读取的时候加上对应的typeOfLevel,而这里我的报错并没有直接提示与typeOfLevel参数有关的信息

~/anaconda3/envs/jzy_tf2/lib/python3.6/site-packages/cfgrib/dataset.py in enforce_unique_attributes(index, attributes_keys, filter_by_keys)267                 fbk.update(filter_by_keys)268                 fbks.append(fbk)
--> 269             raise DatasetBuildError("multiple values for key %r" % key, key, fbks)270         if values and values[0] not in ('undef', 'unknown'):271             attributes['GRIB_' + key] = values[0]DatasetBuildError: multiple values for key 'edition

然后各种百度,没找到我这样的报错后来又转战其他方法,兜兜转转又回来了,感觉这样的报错可能还是因为数据量太大。试过下面的pygrib之后,对数据信息有了大概了解,知道这个数据分为hybrid、surface、isobaricInhPa这三种类型
像下面这样就不会报错了

data=xr.open_dataset('/mnt/f/2022/data/test.grib',engine='cfgrib',backend_kwargs={'filter_by_keys': {'typeOfLevel': 'isobaricInhPa'}})
print(data)

读取成功,结果如下

<xarray.Dataset>
Dimensions:        (isobaricInhPa: 19, latitude: 281, longitude: 361)
Coordinates:time           datetime64[ns] ...step           timedelta64[ns] ...* isobaricInhPa  (isobaricInhPa) int64 1000 950 925 900 850 ... 70 50 20 10* latitude       (latitude) float64 60.0 59.75 59.5 59.25 ... -9.5 -9.75 -10.0* longitude      (longitude) float64 60.0 60.25 60.5 ... 149.5 149.8 150.0valid_time     datetime64[ns] ...
Data variables:q              (isobaricInhPa, latitude, longitude) float32 ...r              (isobaricInhPa, latitude, longitude) float32 ...gh             (isobaricInhPa, latitude, longitude) float32 ...v              (isobaricInhPa, latitude, longitude) float32 ...u              (isobaricInhPa, latitude, longitude) float32 ...pv             (isobaricInhPa, latitude, longitude) float32 ...t              (isobaricInhPa, latitude, longitude) float32 ...d              (isobaricInhPa, latitude, longitude) float32 ...w              (isobaricInhPa, latitude, longitude) float32 ...
Attributes:GRIB_edition:            1GRIB_centre:             ecmfGRIB_centreDescription:  European Centre for Medium-Range Weather ForecastsGRIB_subCentre:          0Conventions:             CF-1.7institution:             European Centre for Medium-Range Weather Forecastshistory:                 2022-03-16T11:38:09 GRIB to CDM+CF via cfgrib-0....

Dimensions(维度)气压层、经度、纬度。
Coordinates(坐标)前面有星号表示可变,没有星号表示固定
Data variables(变量)包含常见的相对湿度r,风速uv等9个要素。
然后进一步提取数据经纬度层次信息,可以看到气压层有19层

读取变量,可以看到变量完整名称long name

可以查看详细信息,可以看到相对湿度r的typeOfLevel

知道自己需要的变量名字及其对应的typeOfLevel,就可以直接读取

data_r = xr.open_dataset("/mnt/f/2022/data/test.grib", engine='cfgrib',\
backend_kwargs={'filter_by_keys': {'typeOfLevel': 'isobaricInhPa', "cfVarName": "r"}})

读取数据后可以位置索引

也可以.loc来索引

第二种方法:pygrib

conda install pygrib
import pygrib as pg
grbs = pg.open("/mnt/f/2022/data/test2.grib")#成功读取文件
#第一次读取数据时因为路径包含中文字符,所以报错了,大家注意,
#报错如下
#UnicodeEncodeError: 'ascii' codec can't encode characters in position 7-11: ordinal not in range(128)

输出变量信息

grbs.seek(0)
for grb in grbs:print(grb)

结果如下,这个文件有601个变量。

1:Specific cloud ice water content:kg kg**-1 (instant):regular_ll:hybrid:level 133:fcst time 0 hrs:from 201806010000
......
601:Temperature:K (instant):regular_ll:isobaricInhPa:level 70:fcst time 0 hrs:from 201806010000

输出信息
数据列表行号,即第几个变量
数据名称(全称)
数据单位
regular表示常规数据
hybrid、isobaricInhPa、surface 表示数据属性,isobaricInhPa表示以hPa为单位的等压面,isobaric-等压的
level表示层次
fcst time表示预报时效
fromxxx表示从xxx起报
以上参考博客数据信息描述

也可以这样查看文件有多少数据

grbs.messages
结果如下
601

看了上面输出信息之后,对文件有了大概了解,
后来又发现如果前面安装了eccodes,就可以在终端直接查看文件信息
可参考ECMWF官方GRIB TOOLS

grib_ls -w typeOfLevel=surface test.grib

根据之前的信息大概知道文件包括hybrid,surface,isobaricInhPa三种类型,可以查看每个type下数据有多少,这个时候我就察觉到这个hybrid,surface,isobaricInhPa其实就是xarray读取数据时typeOfLevel参数,只是我用xarray读取时报错没提示这些信息。

常用isobaricInhPa数据,共计171个变量(9个要素(可看上面xarray输出信息,这里输出太长不好截屏),19层次)

grib_ls -w typeOfLevel=isobaricInhPa test.grib
......
171 of 601 messages in test.grib

综上,可以先终端或者pygrib查看一下数据大概信息,再用xarray读取,个人比较偏向xarray。所以就不继续写pygrib等。
希望对大家有所帮助。
其他方法可参考

meteva库
pygrib库
pygrib库
pyNio库,python2.7/2.8版本

python读取grib数据相关推荐

  1. python批量读取grib_Windows下Python读取GRIB数据

    之前写了一篇<基于Python的GRIB数据可视化>的文章,好多博友在评论里问我Windows系统下如何读取GRIB数据,在这里我做一下说明. 一.在Windows下Python为什么无法 ...

  2. python读取grib文件_Windows下Python读取GRIB数据

    之前写了一篇<基于Python的GRIB数据可视化>的文章,好多博友在评论里问我Windows系统下如何读取GRIB数据,在这里我做一下说明. 一.在Windows下Python为什么无法 ...

  3. python读取grib2数据_python读取grib grib2气象数据

    GRIB是WMO开发的一种用于交换和存储规则分布数据的二进制文件格式,主要用来表示数值天气预报的产品资料.现行的GRIB 码版本有GRIB1 和GRIB2 两种格式.由于小编只接触过GRIB1数据,所 ...

  4. python读取grib格式数据

    python 读取grib/grib2格式数据 一般利用NCL(NCAR Command Language)读取.利用Python语言的pygrib库也可以读取grib/grib2格式数据 grib/ ...

  5. python安装cfgrib读取grib数据

    尝试用xarray基于cfgrib库读取grib数据,通过pip命令安装也成了,提示如下 Found: ecCodes v2.27.0. Your system is ready. 然而,尝试impo ...

  6. python 读取grib \grib2

    python 读取grib \grib2 一.环境准备 (1).python3环境 (2).wgirb工具(用于读取grib1文件),下载地址:  ftp://ftp.cpc.ncep.noaa.go ...

  7. python读取fnl数据计算200-800km范围内的区域平均、散度、涡度实现grads函数

    之前的气象数据如从NCEP中下载的FNL数据一般都是采用Grads处理,但Grads的代码语言比较繁杂,而且一般只用来处理气象数据,所以逐渐都不维护了.作为新生代的python,可以用来解决很多,因此 ...

  8. Windows + Python读取GRIB文件

    Win + Python读取GRIB文件 GRIB文件简介 搭建虚拟环境 主要依赖python库 1. 创建虚拟环境并激活 2. 安装 eccodes 3. 安装 cfgrib 4. 安装xarray ...

  9. python读取excelsheet-一文看懂用Python读取Excel数据

    原标题:一文看懂用Python读取Excel数据 导读:现有的Excel分为两种格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上). Python处理Excel文件主要 ...

最新文章

  1. JavaScript之Unspecified error或无法设置selected属性。未指明的错误。解决方案
  2. 如何上传应用到百度应用(图解攻略)
  3. where里能用max吗_超市里四五元钱的速冻饺子能买吗?
  4. 【面向对象】泛化与继承
  5. Java类初始化及实例化过程
  6. BZOJ 4143 The Lawyer
  7. node.js服务端代码学习
  8. python读取csv文件
  9. 仿淘手游交易平台网站源码
  10. 浅谈《软件工程》常用的几种软件开发方法
  11. JConsole可视化工具介绍
  12. 2019第十届蓝桥杯国赛c++B组真题
  13. 微信小程序的APPID问题
  14. java中多种写文件方式的效率对比实验
  15. 【功能安全】【ISO26262】生产和运行
  16. Netapp常用命令
  17. 淘宝/天猫API,获得淘宝商品评论返回值说明(数据解析)
  18. Java二维数组及面向对象介绍--------08
  19. 2009成渝微型计算机处于空白,2020届广州市高三年级调研测试文综地理试题(5页)-原创力文档...
  20. python程序语言和机器人控制-利用树莓派+Python语言制作一部机器人就是如此简单!...

热门文章

  1. oracle实战编程,Oracle Databa se 11g PL/SQL编程实战_IT教程网
  2. 关于Google身份验证器、基于时间的一次性密码 (TOTP)算法的初步了解
  3. 我眼中的宝鸡景点(r11笔记第53天)
  4. Python常见面试题
  5. voliate类型的原理及用法
  6. css meta自适应,自适应网页
  7. 【记录点滴】StringEscapeUtils.unescapeHtml与StringEscapeUtils.escapeHtml4使用
  8. StringEscapeUtils.escapeHtml的具体使用
  9. 交易不确定性下的最优交易商定价
  10. php里面怎么设置边框颜色,css怎么设置div边框颜色