1、python(我用的3.7.1,其他版本是一样的),需要的python的包:os;
需要的其他东西:wgrib2,下载地址(推荐IE浏览器):可以自行去选择对应的版本
我用的是windows,因此我下载的windows 64下面的。点进去里面东西很多,具体要下哪几个呢?
当然,还有个很简单的方法,你可以先下载这个wgrib2的exe应用程序,然后双击,他会提示你还差什么东西,根据他的提示你一个一个一个安装就可以了。按照他的提示我安装了5个dll文件。你们也可以直接安装这五个就够了。只要你下载了然后点进去不报错就说明成功了。
进入python编译器里面,导入os包,然后第一步将工作目录调至wgrib2的文件夹里面。因为等会我们会用到他(wgrib2)。
下面的代码是使用这个的一个例子,我们可以看到通过这个程序指向我们的一个文件,执行的操作是-v,这个是将fnl文件里面的东西列条列出来。我把它复制到了文本框里面,就是下面这样:
os.system(r"wgrib2 H:\\fnl_chengdu\\test\\fnl_20170320_06_00.grib2 -v")
通过上面的一个例子应该大家都能知道他的一个大概用法,对于我来说,因为我对于这个的话可能更需要的就是单个数据,因此我推荐的几个功能:
-d 可以定位到上面对应的序号,这里不能活成是层,但是可以当成层来理解。比如上面的1代表的是第一层是风速的一个分量,以此类推。
-csv 这个一看大家应该都知道是干嘛了,可以用它把数据提取到csv文件中。但是每个fnl数据里面包含的数据都是多种的,而我们往往只需要用到里面的一种或者几种数据,因此我们可以告诉他我们需要那一层,因此我们可以加上前面的-d,告诉他是那一层。如下:(后边的对应的是输出路径)
os.system(r"wgrib2 H:\\fnl_chengdu\\test\\fnl_20170320_06_00.grib2 -d 1 -csv H:1.csv")
-text 输出成文本,其实与上面的csv类似的,但是也需要你指定层。不然数据量会超级大
-match 这个其实比较好用,比如我们要指定层,可以直接告诉他是多少层,用-d,但是也可以通过名字来匹配,比如:(但是注意,这里这里面TMP有很多层的,不同高度对应的都不一样,所以需要更详细点,加上:比如近地层的啊,2m的啊…)
os.system("wgrib2 H:\\fnl_chengdu\\test\\fnl_20170320_06_00.grib2 -match 'TMP' -csv H:1.csv")
-netcdf 将他转为.nc文件,这时候他就是妥妥的层数据了。这个时候可以再使用python的netcdf包进行进一步的操作。
nc_obj=Dataset('H:\\biyelunwen\\TEM2.nc')
for i in nc_obj.variables.keys():
print(i)
就能够得到如下结果,证明他的数据集有四个,一个经度数据,一个纬度数据,一个时间,一个大气顶层的温度数据。(经过尝试,你用wgrib2处理出来的nc文件都自带经纬度)
import os
os.chdir("E:\\wgrib2")
dir_fnl="H:\\fnl_chengdu\\test\\"
all_file=os.listdir(dir_fnl)
list_name=["TMP","RH","U_wind","V_wind"]
list_floor=["238","239","241","242"]
out_filedir="E:\\气候因子_成都\\"
for file_i in all_file:
file_split=os.path.splitext(file_i)
if file_split[1] == '.grib2':
for i in range(4):
out_name1=file_split[0]
out_name2=out_name1[4:12]
postfix=list_name[i]
out_name=postfix+out_name2+".nc"
filefold_dir=out_filedir+postfix+"\\"
print(filefold_dir)
op_dir=dir_fnl+file_i+" -d "+str(int(list_floor[i]))+" -netcdf "\
+filefold_dir+out_name
os.system(r"wgrib2 "+op_dir)
print(filefold_dir+out_name+" has been done!")
print("All the process has been finished!")
此处我要提取四种气象因为,分别位list_name里面的几种。前面的操作是针对名字什么的,然后给他整合到一个语句,最后再使用os模块结合wgrib2进行处理即可。