| 
 
	积分751贡献 精华在线时间 小时注册时间2018-12-25最后登录1970-1-1 
 | 
 
| 
本帖最后由 jl2587t 于 2021-3-23 17:58 编辑
x
登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册 
  
 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
 
 
 五、看数据
 
   
 数据中看出,第一列第二列是时间,第三列是层次,第四列是经度,第五列是纬度,第六列是温度
 这样我们就可以用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.读取后的数据大家可以用来干任何事情,读取每层的风,算风切变,载读取湿度,计算水汽通量,等等,因为作者不是科班气象出身,其实这些都不会算也要查书现学,但是最底层的捕鱼技能以及在这个帖子里面写出来了。
 
 
 
 
 
 
 
 | 
 |