Metpy新版功能下載TLnP圖設置

  • 2020 年 2 月 19 日
  • 筆記

來自粉絲「青羽」的投稿

文章很長,可以直接看末尾的用法總結。

參考:

Metpy官方文檔

Metpy Skew-T Tutorials

Metpy Skew-T Complex Layout

Siphon Wyoming Upper Air Data Request

用於天氣繪圖的Metpy包更新(0.8版本)了,他們要逐漸拋棄Python2.X,轉到Python>=3.6的版本上。所以,之前(越2018年6月以前,0.7版本)的一些腳本就無法使用了。在大氣科學專業,我們主要使用 Metpy 繪製以懷俄明大學高空探測數據為基礎的斜-T圖(Skew-T)。受更新影響,原本的 upperair_sounding.py腳本也有改動。

新舊MEtoy的改動

老版本的第17~41行為:

from datetime import datetime    import matplotlib.pyplot as plt  from mpl_toolkits.axes_grid1.inset_locator import inset_axes  import numpy as np    import metpy.calc as mpcalc  from metpy.io import get_upper_air_data  from metpy.plots import Hodograph, SkewT    #########################################################################  # Getting Data  # ------------  #  # We will download data from the  # `University of Wyoming sounding data page <http://weather.uwyo.edu/upperair/sounding.html>`_  # , which has an extensive archive of data available, as well as current data.  #  # In this case, we will download the sounding data from the Veterans Day  # tornado outbreak in 2002 by passing a ``datetime`` object and station name to the  # ``get_upper_air_data`` function.    dataset = get_upper_air_data(datetime(2018, 5, 7, 0), 'ZSQD')    ##########################################################################

而新版本的第18~47行為:

import matplotlib.pyplot as plt  from mpl_toolkits.axes_grid1.inset_locator import inset_axes  import numpy as np  import pandas as pd    import metpy.calc as mpcalc  from metpy.cbook import get_test_data  from metpy.plots import Hodograph, SkewT  from metpy.units import units    #########################################################################  # Getting Data  # ------------  #  # Upper air data can be obtained using the siphon package, but for this tutorial we will use  # some of MetPy's sample data. This event is the Veterans Day tornado outbreak in 2002.    col_names = ['pressure', 'height', 'temperature', 'dewpoint', 'direction', 'speed']    df = pd.read_fwf(get_test_data('nov11_sounding.txt', as_file_obj=False),                   skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)    df['u_wind'], df['v_wind'] = mpcalc.wind_components(df['speed'],                                                      np.deg2rad(df['direction']))    # Drop any rows with all NaN values for T, Td, winds  df = df.dropna(subset=('temperature', 'dewpoint', 'direction', 'speed',                         'u_wind', 'v_wind'), how='all').reset_index(drop=True)    ##########################################################################

對比可以發現,用於繪圖的模組基本沒變,而是用於讀取數據的模組變了,無論是庫還是程式碼調用方法。

from metpy.io import get_upper_air_data  ---  from metpy.cbook import get_test_data    dataset = get_upper_air_data(datetime(2018, 5, 7, 0), 'ZSQD')  ---  df = pd.read_fwf(get_test_data('nov11_sounding.txt', as_file_obj=False),                   skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)

而從官方說明文檔中得知,獲取數據這個功能被獨立出來,用Siphon這個庫實現。讓我們來看看Siphon時何方神聖?搜索Siphon文檔得知,這貨就是個專門爬氣象數據的包。他提供

  • netCDF 格式的NCSS的數據
  • NDBC 的浮標數據(海洋人的最愛)
  • 高空探測數據,懷俄明大學數據源(Wyoming data)和IGRA2數據源(Integrated Global Radiosonde Archive)

之前我喜歡用懷俄明大學的數據,所以這次就來看看要怎麼用懷俄明大學的數據畫Skew-T圖。

分析新版本的數據讀取的語句

df = pd.read_fwf(get_test_data('nov11_sounding.txt', as_file_obj=False),                   skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)

得知,nov11_sounding.txt 是官方內置的一個示例數據文件,這行程式碼主要是用pandos的功能讀取一個列表數據。

如果能用Siphon下載同格式的數據的話,那麼只要改改讀取的文件名就可以了。我們看一下這個神奇的txt文件在哪裡 運行一下腳本

python3 upperair_soundings.py  ---  /home/bugatti/anaconda3/lib/python3.6/site-packages/pooch/core.py:260: UserWarning: Downloading data file 'nov11_sounding.txt' from remote data store 'https://github.com/Unidata/MetPy/raw/v0.10.0/staticdata/' to '/home/bugatti/.cache/metpy/v0.10.0'.    action, fname, self.base_url, str(self.path)  923.0963220202037 hectopascal 15.595422727825456 degC  /home/bugatti/anaconda3/lib/python3.6/site-packages/pint/quantity.py:1377: UnitStrippedWarning: The unit of the quantity is stripped.    warnings.warn("The unit of the quantity is stripped.", UnitStrippedWarning)

能夠成功出圖,然後看到命令行窗口的第二行顯示這個文件在'/home/bugatti/.cache/metpy/v0.10.0' 這個目錄里,bugatti是我的用戶名,換在你的電腦中應該也是類似的路徑。打開這個文件格式如下:

-----------------------------------------------------------------------------     PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV      hPa     m      C      C      %    g/kg    deg   knot     K      K      K  -----------------------------------------------------------------------------   1000.0    -12    978.0    180   20.4   16.5     78  12.22    180     16  295.4  330.7  297.6    964.1    305   22.2   17.1     73  12.92    185     29  298.5  336.3  300.8    954.0    397   23.6   17.6     69  13.45    188     35  300.8  340.5  303.2    931.0    610   22.5   16.5     69  12.84    195     49  301.7  339.8  304.1    925.0    667   22.2   16.2     69  12.68    200     48  302.0  339.7  304.3    898.9    914   20.2   14.5     70  11.68    205     49  302.4  337.2  304.5    867.6   1219   17.7   12.4     71  10.54    215     52  302.9  334.4  304.8    850.0   1396   16.2   11.2     72   9.92    220     55  303.1  332.9  304.9

這個和在懷俄明無線電探空數據網站 的數據格式一模一樣(畢竟就是從這爬取的數據嘛)

Siphon的文檔的說明

  1. 導入讀取懷俄明大學數據讀取模組
from datetime import datetime    from metpy.units import units    from siphon.simplewebservice.wyoming import WyomingUpperAir
  1. 設置要獲取的地點和時間
date = datetime(2017, 9, 10, 6)  station = 'MFL'
  1. 發送請求,拉取數據
df = WyomingUpperAir.request_data(date, station)

就是這麼簡單粗暴!

唯一需要注意的是時間格式的設置

在Spyder中運行上述程式碼,獲取數據,在變數窗口查看數據值

與懷俄明大學網站的數據列表作對比

發現 (2017, 9, 10, 6)表示的就是2017年9月10日6時。6所在位置的參數只有(0, 6, 12)三個數字可選。這裡使用的是世界時,0和12也就是中國地區早八晚八時放氣球,美國邁阿密(站號MFL,時區西五區)大概是晚七早七,6屬於補測的時間,一般是由於天氣過程複雜,或者早上的數據沒測好才會有補測的6時。

回到數據讀取問題上來,示例文件中的語句是把一個寫好的txt文件讀取為類似nc文件那樣帶變數描述的值的一個東西。

df = pd.read_fwf(get_test_data('nov11_sounding.txt', as_file_obj=False),                   skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)

而siphon爬去網路數據就直接是這樣的格式,所以如果要改為自己想要的某天日期也十分簡單。就是把示例文件中的語句注釋掉,然後添加如下程式碼:

#df = pd.read_fwf(get_test_data('nov11_sounding.txt', as_file_obj=False),  #                 skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)    from datetime import datetime  from siphon.simplewebservice.wyoming import WyomingUpperAir    date = datetime(2019, 3, 25, 0)  station = 'MFL'  df = WyomingUpperAir.request_data(date, station)

運行得到本文寫作當天早八點的探空圖。嗯,看樣子多雲天還得持續幾天。

最後添加一些使程式碼更容易使用的語句:

print('歡迎使用 Metpy 和 Siphon 獲取懷俄明大學無線電探空數據,使用方法如下:')  print('1.輸入』年月日時『和站號,如『2019032500ZSQD』,中間無間隔。')  print('2.輸入圖片保存路徑,回車默認腳本所在文件夾。')  print('提示:探空時段採用世界時,一般為00或12,06為補測數據,請自行換算時區。')  print('     中國區常用站號:北京-ZBAA,青島-ZSQD,昆明-ZPPP,南京-ZSNJ')  dateNum=input('請輸入日期和站號')  figpath=input('請輸入保存路徑')  print('正在獲取探空圖',dateNum[:4], dateNum[4:6], dateNum[6:8], dateNum[8:10],dateNum[10:])  print('保存路徑為',figpath)

使用截圖

點擊下載程式碼

(PS:Siphon的意思是『虹吸管』,很適合它,吸數據的虹吸管)

轉載請註:Metpy新版功能下載TLnP圖設置 - Bugatii100Peagle

更多詳見:https://zhuanlan.zhihu.com/p/102032513

Tags: