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