Python读取grib数据获取变量推荐姿势

前情提要

最近使用的EC和GFS预报数据给的都是grib2格式的,之前用惯nc格式的,python读取grib2数据的时候还走了些弯路,看到很多博客上给的教程其实不能满足我的需求,现在搞明白了分享一下

pygrib安装

第一个问题就是我电脑上pygrib安装都折腾了一阵子
我电脑上直接pip是装不上去的

pip3 install pygrib

使用conda的时候最好使用的是conda-forge源的,用这个装成功了

conda install -c conda-forge pygrib

pygrib使用

遍历一下查看数据

以一个GFS的预报数据为例,我们使用pygrib读取之后,得到的是一个可迭代对象,可以拿来循环

import pygrib
grbs = pygrib.open('gfs.t00z.pgrb2.0p25.f024')
for grb in grbs:
    print(grb)

我们来看一下遍历出的grbmessage对象打印出来是什么

1:Pressure reduced to MSL:Pa (instant):regular_ll:meanSea:level 0:fcst time 24 hrs:from 202407210000
2:Cloud mixing ratio:kg kg**-1 (instant):regular_ll:hybrid:level 1:fcst time 24 hrs:from 202407210000
3:Ice water mixing ratio:kg kg**-1 (instant):regular_ll:hybrid:level 1:fcst time 24 hrs:from 202407210000

可以发现,每一个grbMessage对象可以是二维格点数据,同时单位,气压层等维度信息也是有的
以“510:Temperature:K (instant):regular_ll:isobaricInhPa:level 95000 Pa:fcst time 24 hrs:from 202407210000”为例,表示的意思如下

  1. 510: 这是记录的索引或序号。它标识这是文件中的第 510 个记录。

  2. Temperature: 这是变量的名称。在这里,它表示“温度”。

  3. K (instant): 这是变量的单位和时间类型。

    • K 表示开尔文,是温度的单位。
    • instant 表示这是瞬时值。
  4. regular_ll: 这是网格类型,regular_ll 表示规则的纬度/经度网格。

  5. isobaricInhPa: 这是变量所属的层。在这里,它表示等压面。

  6. level 95000 Pa: 这是变量的层次信息。这里表示95000帕斯卡 (Pa) 等压面(950 hPa 等压面)。

  7. fcst time 24 hrs: 这是预报时间。这里表示从初始时间起 24 小时后的预报。

  8. from 202407210000: 这是初始时间,表示 2024 年 7 月 21 日 00:00。

获取变量

我下载的明明有41个高度层的信息,但是这样便利出来每一条数据都只是一个二维变量,我最终想获得的温度数据应该是三维数据,这意味着我需要将遍历的数据中为Temperature的调出来将他们拼成三维数组,这样才获取了一个变量完整的数据

在这里插入图片描述
可以看到,遍历出的数据以Temperature开头的就有56个,这是将非等压面的一些奇怪的Temperature也算上的总数

因此我们需要从中获取grbs中真正是气压层的Temperature

import pygrib
import numpy as np

def select_variable(filepath, variable, typeOfLevel):
    # 打开GRIB2文件
    grbs = pygrib.open(filepath)
    for grb in grbs:
        print(grb)
    temperature_records = grbs.select(name='Temperature', typeOfLevel='isobaricInhPa')
    # 获取记录数量
    num_records = len(temperature_records)
    
    # 假设所有记录的维度相同,获取第一个记录的维度
    # 这里使用第一个记录来确定数据的维度
    first_record = temperature_records[0].values
    data_shape = first_record.shape
    
    # 创建一个三维数组来存储温度数据
    select_data = np.zeros((num_records, *data_shape))
    
    # 提取每个记录的数据并存储到三维数组中
    for i, record in enumerate(temperature_records):
        select_data[i, :, :] = record.values
    return select_data


filepath = '../download_res/ncep/20240721/gfs.t00z.pgrb2.0p25.f024'
variable = 'Temperature'
typeOfLevel='isobaricInhPa'
T = select_variable(filepath, variable, typeOfLevel)
print(np.shape(T))

这个函数和案例就展示了如何从grib数据中获取需要的变量
这里需要解释的是typeOfLevel=‘isobaricInhPa’,这是因为这个数据中只要是有不同高度层的数据,他的typeOfLevel就是isobaricInhPa,因为除了高度层的Temperature可以看到这种不是描述等压面温度的Temperature,如果不加上typeOfLevel='isobaricInhPa就会把他们也筛选出来
在这里插入图片描述

推荐使用Panoply查看grib数据先大概了解数据

Panoply直接搜索Panoply去官网下载之后直接打开即可,现在需要Java11装好,也很简单,去orical官网下载Java11的非安装版本,之后配置一下环境变量,在cmd输入java -version看到是11就可以了,无脑使用

可以看到,与pygrib不一样,Panoply直接会读出一个叫Temperature isobaric的变量,表示的就是有不同气压层的温度变量,这样可以很直观地看到数据的维度,但需要注意的是panoply和pygrib读出的变量可能长得不一样,需要留意
在这里插入图片描述
在Panoply中也可以一目了然总共有什么变量,再回去python中遍历一下找到pygrib读出来的变量名,获取变量

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 Python 的库来读取 GRIBGRIB2 文件。其中,pygrib 是一个比较流行的库,可以读取和解码 GRIBGRIB2 文件。以下是一个简单的示例: ```python import pygrib # 打开 GRIB2 文件 grbs = pygrib.open('path/to/grib2/file') # 获取第一个 GRIB2 消息 grb = grbs.read(1)[0] # 输出消息内容 print(grb) # 关闭文件 grbs.close() ``` 除了 pygrib,还有其他的库也可以用来读取 GRIBGRIB2 文件,比如 cfgrib、xarray 等。你可以根据自己的需要选择适合的库。 ### 回答2: Python可以使用`pygrib`库来读取和处理grib文件grib2文件。 首先,我们需要安装pygrib库,可以使用pip命令进行安装: ``` pip install pygrib ``` 接下来,我们需要导入pygrib库: ```python import pygrib ``` 然后,可以使用`open`函数打开一个grib文件或者grib2文件: ```python grbs = pygrib.open('file.grib') ``` 通过这个打开的文件对象,我们可以获取文件中的所有grib消息(grb消息): ```python grb_messages = grbs.messages ``` 如果我们只对文件中的特定消息感兴趣,我们可以使用索引来获取特定的grib消息: ```python grb = grbs.message(index) ``` 获取grib消息的各种属性,可以使用一些内置的方法和属性,例如: ```python data = grb.values # 获取grib消息中的数据 lat, lon = grb.latlons() # 获取grib消息中的经纬度坐标 ``` 最后,记得在使用完毕后,关闭文件对象: ```python grbs.close() ``` 通过上述的步骤,我们可以使用Python读取和处理gribgrib2文件中的数据。具体的数据处理方法可以根据具体需求来使用,例如可视化、统计等等。由于gribgrib2是气象学中常用的数据格式,Python读取和处理能力为我们进一步分析气象数据提供了很多便利。 ### 回答3: Python可以使用多种库来读取和处理grib文件,其中比较常用的有eccodes和pygrib。 eccodes是ECMWF开发的一个用于处理gribgrib2文件的开源库。可以通过pip安装eccodes库,并使用它提供的API来读取gribgrib2文件中的数据。在使用eccodes之前,需要先下载和安装eccodes的二进制文件,并设置相关的环境变量。使用eccodes读取grib文件的代码示例如下: ```python import eccodes # 打开grib文件 file = eccodes.GribFile('data.grib') # 遍历文件中的消息 for msg in file: # 打印消息的描述 print(msg.get('parameterName'), msg.get('shortName'), msg.get('units')) # 获取消息的数据 data = msg.get_values() # 处理数据 # 关闭文件 file.close() ``` pygrib是另一个用于处理gribgrib2文件的库,可以通过pip安装。pygrib具有类似的API,可以用于读取和处理grib文件。使用pygrib读取grib文件的代码示例如下: ```python import pygrib # 打开grib文件 file = pygrib.open('data.grib') # 遍历文件中的消息 for msg in file: # 打印消息的描述 print(msg.parameterName, msg.shortName, msg.units) # 获取消息的数据 data = msg.values # 处理数据 # 关闭文件 file.close() ``` 使用这些库可以方便地读取gribgrib2文件,并对其中的数据进行处理和分析。需要根据实际的需求选择合适的库和方法来读取和处理grib文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值