爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 48561|回复: 16

[经验总结] window下python读取grib2数据

[复制链接]

新浪微博达人勋

发表于 2021-3-23 17:58:05 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 jl2587t 于 2021-3-23 17:58 编辑

window下python读取grib2数据
这一帖子是介绍如何在window系统下利用python读取grib2数据的过程。
一、概述
python在Linux系统下是可以直接利用包来读取grib2数据数据的,但是window系统下这个包好像不能用,那么咱们有两种途径去读取grib2数据。
1.利用二进制,一个字节一个字节去读取数据。
2.利用wgrib2.exe去读取数据。
相信大部分人都不会有第一种方式,除非没办法,本帖子也是介绍第二种方式。
二、wgrib2.exe
wgrib2.exe是一个应用程序,具体作用我不甚了解,但是当拿到grib2数据以后,经过各种查找,均告诉我可以利用它来读取grib2数据,因此也是百转千回的找到了一个版本,并且利用成功,如果大家无法找到,可以邮件作者,作者给你发一个。只需将这个exe放到一个文件夹下即可,不用双击打开,本文介绍的是用python完成。
三、读取文件
import os
os.chdir(r"D:\project\study_way\cartopy\grib2\3.0.2")# 将当前目录转到wgrib2工具目录
os.system(r"wgrib2 fnl_20200509_12_00.grib2 -v")# # 执行cmd命令,查看各个每一条参数信息

当我们执行上述代码之后,就会出现如下信息:
1:0:d=2020050912:CLMR Cloud Mixing Ratio [kg/kg]:1 hybrid level:anl:
2:4194:d=2020050912:ICMR Ice Water Mixing Ratio [kg/kg]:1 hybrid level:anl:
3:13859:d=2020050912:RWMR Rain Mixing Ratio [kg/kg]:1 hybrid level:anl:
。。。
8:162994:d=2020050912:UGRD U-Component of Wind [m/s]:planetary boundary layer:anl:
9:217434:d=2020050912:VGRD V-Component of Wind [m/s]:planetary boundary layer:anl:
。。。
13:439007:d=2020050912:TMP Temperature [K]:0.4 mb:anl:
这里我摘录了几个,大致几百行这样的信息,接下来我将会拿出一条来给大家介绍一下
例如:13:439007:d=2020050912:TMP Temperature [K]:0.4 mb:anl:
格式:        序号:***:时间:变量 解释 [单位]:层次或者分类标准:再分析
如此对应,序号13里面存放的就是0.4毫巴层次的温度,单位为K
至于其他的变量,大家看后面跟着的解释就好了。
这一步是必须要做的,目的是搞清楚我们需要的内容存放在哪里,特征信息是什么。
四、提取信息
os.system(r"wgrib2 fnl_20200509_12_00.grib2 -match ':TMP:2 mb' -csv 2mb_tmp.csv")
上述代码的含义就是,利用wgrib2读取fnl_20200509_12_00.grib2,然后提取TMP,2 mb的数据,存入格式csv,文件名2mb_tmp.csv
文件会出现在于wgrib2相同的目录下,fnl数据也放在其中,因为我用的相对路径,大家不想这么放也可以使用绝对路径
重点解释一下-match ':TMP:2 mb',-match应该是一个命令,筛选的意思,具体大家可以去学习wgrib2,冒号(:)是一个分隔符,是语法要求,每一个冒号后面跟一个条件,所有条件用单引号包起来,许满足所有条件的数据才会被输出成一个csv(也可以是其他格式)
上面那句代码的含义就是提取2毫巴高度层的温度,生成一个2mb_tmp.csv


五、看数据
2021-03-23_171726.png

数据中看出,第一列第二列是时间,第三列是层次,第四列是经度,第五列是纬度,第六列是温度
这样我们就可以用pandas之类的包去读取数据,分析画图了,当然,还可以生成nc格式的
例如:os.system(r"wgrib2 fnl_20200509_12_00.grib2 -match ':TMP:2 mb' -netcdf 2mb_tmp.nc")


五、grib2批量生成nc格式的数据
下面给出一个grib2批量生成nc格式的python代码
不是作者写的,是在研究怎么都grib2数据时发现的,分享给大家


#版权声明:本文为CSDN博主「Lf zhang」的原创文章
#原文链接:https://blog.csdn.net/zhanglingfeng1/article/details/113789121



import os

os.chdir("E:\\wgrib2")#他的wgrib2放在E盘根目录
dir_fnl="H:\\fnl_chengdu\\test\\"#fnl文件路径文件夹
all_file=os.listdir(dir_fnl)#获取文件夹下的所有文件,返回一个文件名列表

#-----------------这两步需要使用帖子之前的方法先找到对应关系-------------------#
list_name=["TMP","RH","U_wind","V_wind"]#变量名称
list_floor=["238","239","241","242"]#变量代号
#-----------------这两步需要使用帖子之前的方法先找到对应关系-------------------#

out_filedir="E:\\气候因子_成都\\"#nc文件输出路径文件夹
for file_i in all_file:#开始循环每一个文件
    file_split=os.path.splitext(file_i)#对文件名进行分割
    if file_split[1] == '.grib2':#判断读到的文件是否为grib2数据
        for i in range(4):#循环四次,对应上面的四个变量
            out_name1=file_split[0]
            out_name2=out_name1[4:12]
            postfix=list_name
            out_name=postfix+out_name2+".nc"#进行一系列的字符串操作,生成nc文件的文件名
            filefold_dir=out_filedir+postfix+"\\"#路径
            print(filefold_dir)
            op_dir=dir_fnl+file_i+" -d "+str(int(list_floor))+" -netcdf "\
               +filefold_dir+out_name#字符串加操作,生成wgrib2的一个操作命令
            os.system(r"wgrib2 "+op_dir)#进行grib2和nc的转化
            print(filefold_dir+out_name+" has been done!")
print("All the process has been finished!")


#版权声明:本文为CSDN博主「Lf zhang」的原创文章
#原文链接:https://blog.csdn.net/zhanglingfeng1/article/details/113789121



里面的内容肯定不会适用于每个人,需要大家自行修改,我每一行都做了注释。如果还是不行,可以照帖子之前的做法一个一个去弄。




六、总结
1.python读取grib2数据的实质是利用os库,调用window命令行窗口,去执行wgrib2.exe,然后利用wgrib2.exe读取grib2数据并转化成其他格式。
2.转化格式以后不需要再单独写一个py文件,可以接着写下去,最后还可以删除利用wgrib2.exe保存的文件,假装没有利用过他
3.读取后的数据大家可以用来干任何事情,读取每层的风,算风切变,载读取湿度,计算水汽通量,等等,因为作者不是科班气象出身,其实这些都不会算也要查书现学,但是最底层的捕鱼技能以及在这个帖子里面写出来了。






所需相关材料.rar

28.97 MB, 下载次数: 163, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-4-25 08:32:50 | 显示全部楼层
都是我的锅……2019年讲课和视频都是wgrib2转nc
建议楼主先搜一下,论坛其实有Windows直接读取grib的帖子,xarray+cfgrib+eccodes扩展库。后来还有了xarray+pygrib。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2021-3-23 18:29:22 | 显示全部楼层
python 在window下,可以直接读取grib数据的,用conda安装相关包即可
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-3-23 18:46:10 | 显示全部楼层
1099221723 发表于 2021-3-23 18:29
python 在window下,可以直接读取grib数据的,用conda安装相关包即可

看来我被骗了,包叫啥名字
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-3-24 09:08:02 | 显示全部楼层
jl2587t 发表于 2021-3-23 18:46
看来我被骗了,包叫啥名字

常见的python读取grib的包都可以安装
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-3-24 17:51:18 | 显示全部楼层
本帖最后由 阿阿飞飞 于 2021-3-24 17:58 编辑

可以直接使用java的netcdf包直接转换grib2为netcdf格式,不需要选择变量,直接一行命令全部转换。此方法前面准备工作多了两步,但后续工作非常简便,还可以批量处理,具体如下:
step1:下载安装java运行环境
下载地址:https://www.oracle.com/java/technologies/javase-jre8-downloads.html
打开网页后,拖到最下面,如果是64位windows的话,选倒数第二个下载,下载后进行安装。

step2:下载netcdf的java包
下载地址:https://artifacts.unidata.ucar.edu/content/repositories/unidata-releases/edu/ucar/netcdfAll/5.4.1/netcdfAll-5.4.1.jar
下载后,拷贝到grib2文件所在目录,这样可以避免输入路径信息。

step3:使用命令行或批处理进行转换
在grib2文件所在目录空白处,右键新建txt文本文件,将下面命令粘贴过去,仅仅修改红色部分为你的输入文件,以及输出文件名称即可,其它部分不需要修改,仅在处理大文件时,可以修改-Xmx512m 里面的数字512为1024,注意与step2中的netcdfAll-5.4.1.jar文件名严格对应

java -Xmx512m -classpath netcdfAll-5.4.1.jar ucar.nc2.dataset.NetcdfDataset -in infile.grib2 -out outfile.nc

完成后,关闭txt文件,修改扩展名为.bat文件,双击运行即可。
如果需要转换的文件多的话,可以使用python程序直接生成批处理文件,用于批量处理。

step4:使用xarray读取转换后的nc文件
可以单个文件读取xr.open_dataset,或者批量读取xr.open_mfdataset,正常按xarray的的方法进行后续处理操作即可。


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-3-24 19:52:45 | 显示全部楼层
阿阿飞飞 发表于 2021-3-24 17:51
可以直接使用java的netcdf包直接转换grib2为netcdf格式,不需要选择变量,直接一行命令全部转换。此方法前 ...

总结一下,第一步装JAVA环境;第二步装JAVA三方包;第三步创建批处理程序bat;第四步用python去执行批处理程序。说实话更麻烦,既然都装JAVA了,直接用JAVA就好了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-3-24 21:16:48 | 显示全部楼层
jl2587t 发表于 2021-3-24 19:52
总结一下,第一步装JAVA环境;第二步装JAVA三方包;第三步创建批处理程序bat;第四步用python去执行批处 ...

适合不会用java的,只会用python的人。而且用python的xarray处理时空纬度的nc文件,比java更方便
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-4-24 18:30:36 | 显示全部楼层
这个贴好多干活,马克学习一下
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-4-24 22:59:13 来自手机 | 显示全部楼层
Kuirs 发表于 2021-04-24 18:30
这个贴好多干活,马克学习一下

what

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表