Siphon使用IGRA2为数据源画探空图
- 2020 年 2 月 19 日
- 筆記
Siphon 还提供了 Integrated Global Radiosonde Archive (IGRA2)为数据源的数据管道。在修改完uwyo的代码后,顺便来看看另一个数据集的。使用的话我感觉还是怀俄明哪个比较好,它更新快,基本上国际时间00,12时一过半小时就可以访问最新的数据;而且国内访问也快;绘图代码简单易懂,也便于气象工作者根据自己的需要再次修改。IGRA2的更新比较慢,反正是3月份这回的中国区基本都是提示无数据;访问也很慢,不清楚是墙的原因还是网站本身技术的原因,和Matlab启动速度有的一拼;代码比怀俄明的那个稍微复杂些,因为他提供的数据参量更多,像位温,假位温这样的都有,怀俄明的只有一个露点。需要精细化比对探空数据的可能需要IGRA2的数据,需要快速分析天气的更喜欢怀俄明。 IGRA2 Upper Air Data Request 官网文档给出了具体用法,和怀俄明的那个模块很相似
带入模块
from datetime import datetime from siphon.simplewebservice.igra2 import IGRAUpperAir
设置站好和时间
date = datetime(2014, 9, 10, 0) station = 'USM00070026'
发送请求,获取数据
df, header = IGRAUpperAir.request_data(date, station)
这里有两点需要注意

- 站点编号。IGRA2目前收录了2700多个站点的数据(如上图密密麻麻的红点),为了便于管理,给各个站点都做了统一编号,这个编号的组成大约是’国家代码‘+’000‘+’原站点编号‘。这里的原站点编号就是怀俄明网站上各个站点的5位数编号,像青岛原本用ZSQD表示的就是54857,四位字母编号一般是省市级的站点才有。而IGRA2官方也提供了一份详细的全球站点统一编号列表,包含每个站点的编号,位置(经纬度),网络关联,站点名称和记录周期。
- 获取格式中的header。header表示的相当于nc文件的头文件,用于描述这段数据的一些特征。而df才是爬到的数据。
而IGRA2的数据也与怀俄明的不一样
dfIGRA2.keys() --- Out[26]: Index(['pressure', 'reported_height', 'calculated_height', 'temperature', 'temperature_gradient', 'potential_temperature', 'potential_temperature_gradient', 'virtual_temperature', 'virtual_potential_temperature', 'vapor_pressure', 'saturation_vapor_pressure', 'reported_relative_humidity', 'calculated_relative_humidity', 'u_wind', 'u_wind_gradient', 'v_wind', 'v_wind_gradient', 'refractive_index', 'date'], dtype='object') ========================== dfuwyo.keys() --- Out[27]: Index(['pressure', 'height', 'temperature', 'dewpoint', 'direction', 'speed', 'u_wind', 'v_wind', 'station', 'station_number', 'time', 'latitude', 'longitude', 'elevation'], dtype='object')
比较麻烦的是IGRA2的数据没有露点的数据,而这个数据有是绘图必须的。好在Metpy库提供了calc的计算模块,专门处理大气科学上的这些乱七八糟的计算。这里用metpy.calc.dewpoint这个功能实现从水汽分压计算露点。官方也给出了一个示例,可以直接用。虽然功能上说是用水汽分压计算,但是只要有表面压强就可以计算了。
mixing = 10 * units('g/kg') e = mpcalc.vapor_pressure(list(df['pressure'])* units.mbar, mixing) df['dewpoint'] = mpcalc.dewpoint(e)
最后还有风速和风向这两个参数没有解决,calc也提供了模块搞定这个问题。怀俄明的代码是用风速和风向算u,v分矢量,而IGRA2恰好反过来。
df['u_wind'], df['v_wind'] = mpcalc.wind_components(df['speed'],np.deg2rad(df['direction'])) --- df['speed']=mpcalc.wind_speed(df['u_wind'], df['v_wind']) df['direction']=mpcalc.wind_direction(df['u_wind'], df['v_wind'])
calc还有其他功能,可以查阅官方文档了解。
添加如下代码:可以使程序运行,但是风向的转换似乎有问题,而官方的calc的包也总是报错,暂时不管了,先这么滴吧,还是用怀俄明的数据吧。
f, header= IGRAUpperAir.request_data(date, station, derived=True) df['speed']=mpcalc.wind_speed(df['u_wind'], df['v_wind']) def mydirection(u,v): theta=np.arctan2(u, v) mydirection=np.rad2deg(theta)+180 return mydirection df['direction']=mydirection(df['u_wind'], df['v_wind']) mixing = 10 * units('g/kg') e = mpcalc.vapor_pressure(list(df['pressure'])* units.mbar, mixing) df['dewpoint'] = mpcalc.dewpoint(e)
转载请注:Siphon使用IGRA2为数据源画探空图 – Bugatii100Peagle
更多详见:https://zhuanlan.zhihu.com/p/102032217