社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

原创代码 | Python处理探空数据及可视化

happy科研 • 4 年前 • 1877 次点击  

背景 |


2020年,美国飓风 Laura 临近登陆时,NOAA派出飞机投放探空仪观测,很快推特上便有了相应的T-lnP图,如下图。



我国在2020年,也进行了XX计划。台风森拉克过境后,即在台风外围投放了数十枚探空仪,获取了非常密集的温压湿风探空曲线。这是当时的卫星云图(如下图,来源:韩国GK2A卫星),可以看到,当时台风主体已经进入越南境内,而释放探空仪的位置位于海南岛东南近海。


真彩色云图


红外增强云图


读数据 |


由于所用数据是Excel的表格,我们用Pandas读取其表单。


from datetime import datetime,timedeltaimport pandas as pdf = '17_54_4.xls'# 将时间解析为datetime类dateparse = lambda x: datetime.strptime('2020-08-02 ' + x, '%Y-%m-%d %H:%M:%S')df = pd.read_excel(f,sheet_name=0,parse_dates=['时间'], date_parser=dateparse)# 时间         纬度          经度     位势高度     温度     湿度     气压  风速  风向#                                     m           degC     %       hPa   m/s  deg   # convert BJT -> UTCdf['时间'] = df['时间'] - timedelta(hours=8)df[df == -9999] = np.nandf = df[::-1]


读取结果


绘T-lnP图 |


用NCAR开发的Metpy包来画T-lnP图,官方链接如下:

https://unidata.github.io/MetPy/latest/

官方提供了诸多例子,包括画常规天气图和T-lnP图,以及计算物理量、诊断量。链接如下:

https://unidata.github.io/MetPy/latest/examples/index.html

根据Simple_Sounding例子,来画我们所需最简单的T-lnP图。注意:美国人用的是斜T-lnP,即旋转30度,而国内是T-lnP,需要改成0度。

对应的函数接口如下:

https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html#metpy.plots.SkewT


SkewT的函数说明


具体绘图脚本如下:


# 代码来源:“happy科研”公众号# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
import matplotlib.pyplot as pltimport metpy.calc as mpcalcfrom metpy.plots import SkewT, Hodographfrom metpy.units import unitsimport metpy.interpolate as mpi
# 转换为Metpy的数据类p = df['气压'].values * units.hPaT = df['温度'].values * units.degCrh = df['湿度'].values / 100Td = mpcalc.dewpoint_rh(T, rh)wsp = df['风速'].values * units('m/s')wdr = df['风向'].values * units.degreesu, v = mpcalc.wind_components(wsp, wdr)
# 开一个画布fig = plt.figure(figsize=(12, 12))skew = SkewT(fig, rotation=0)
# 画温度、露点和风skew.plot(p, T, 'r')skew.plot(p, Td, 'g')skew.plot_barbs(p[::5], u[::5], v[::5])skew.ax.set_ylim(1000, 250)skew.ax.set_xlim(-40, 30)
# 计算对流凝结高度,p[0]为最低层气压lcl_pressure, lcl_temperature = mpcalc.lcl(p[0], T[0], Td[0])skew.plot(lcl_pressure, lcl_temperature, 'ko', markerfacecolor='black')
# 画状态曲线prof = mpcalc.parcel_profile(p, T[0], Td[0]).to('degC')skew.plot(p, prof, 'k', linewidth=2)
# 画对流有效位能和抑制能skew.shade_cin(p, T, prof)skew.shade_cape(p, T, prof)
# 画0度温度线,图中紫色虚线skew.ax.axvline(0, color='c', linestyle='--', linewidth=2)
# 干绝热线skew.plot_dry_adiabats()# 湿绝热线skew.plot_moist_adiabats()# 等比湿线skew.plot_mixing_lines()


T-lnP图, 世界时: 2020-08-02T10


可以看出台风过后CAPE还是比较大。



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/105697
 
1877 次点击