Help us understand the problem. What is going on with this article?

気象要素を計算するPythonモジュールを公開します

はじめに

気象関係の要素を計算する関数、例えば気温と相対湿度から露点温度を求める関数などを集めたPythonモジュール wxparams を作ったので、公開します。
Weather Parametersの略)

Pythonを始める前はPerlで気象データを処理するスクリプトをよく書いていて、やはり気象関係でよく使う関数をPerlモジュールにまとめていました。コロナ禍の影響で家で過ごす時間が増えたので(笑)、この機にPythonに書き換えようと思ったのがきっかけです。

どうせ作るなら公開してしまおうということで、ソースコードはGitHub、使い方などの説明はこの記事にまとめました。

  • Ver1.0 : 2020/04/24
  • Ver1.1 : 2020/05/27
    • 気温の単位、摂氏 <=> 華氏の変換を追加

インストール

私のGitHubからpipインストールできます。

pip install git+https://github.com/Yoshiki443/weather_parameters

pipインストールに抵抗がある方は、GitHubwxparams/wxparams.pyだけダウンロードして使っていただいても良いです。

ライセンス

MITライセンスとしています。

主な機能

  1. 風を扱う関数
    • 風のUV成分 <=> 風向・風速の変換、8方位・16方位風向、cross windなど
  2. 大気中の水分量を扱う関数
    • 相対湿度 <=> 露点温度の変換、飽和水蒸気圧、混合比など
  3. 大気安定度に係る関数
    • 温位、相当温位、SSI、K-Indexなど
  4. 単位変換
    • m/s <=> knot の変換, meter <=> feet の変換など

使い方

コード例を先にご紹介します。

import numpy as np
import wxparams as wx
temp = np.array([[0., 5.],[10., 20.]]) # 気温[C]
rh = np.array([[90., 50.], [70., 99.5]]) # 湿度[%]
td = wx.RH_to_Td(temp, rh) # 露点温度[C]
print(td)
# 出力
# [[-1.44330606 -4.56523582]
#  [ 4.78251527 19.91913689]]

まずimportします。コード例にある省略名「wx」はweatherの略としてよく使われるものです。importしたら関数を呼び出します。上の例では、気温と相対湿度から露点温度を計算する場合を示しています。

ここで入力するデータは基本的に numpy.ndarray を想定しています。もしくは pandas.Series でも動作します。個々の気象要素を1つずつ入力した場合、動作する関数と動作しない関数があります。

入力データとして、例えばGPVのある気圧面のある気象要素(つまり2次元配列)を丸ごと入力して別の気象要素を計算したり、csvなど構造化データのある気象要素の列を入力して別の気象要素を計算したり、といった使い方を想定しています。

一部の処理で numpy.ndarray を前提としたものもあるので、作成者としては numpy.ndarray を推奨します。

以下、各関数の説明です。

風を扱う関数

UV_to_SpdDir(U, V)

風のUV成分から、風向・風速を計算します。
UV成分とは、U=東西風・V=南北風を表し、気象庁MSMなど数値予報GPVの風データは通常UV成分になっています。一般には東西風なら西風が正の値、南北風なら南風が正の値になっています。
風速の単位は m/s, knot など速度の単位なら何でもOKです。
風向は真北が0度ではなく、360度となります。風速が0だった場合に風向も0度となります。

引数(Parameters) :

  • U : array_like
    • 風のU成分(東西風成分)
  • V : array_like
    • 風のV成分(南北風成分)

戻り値(Returns) :

  • Wspd : array_like
    • 風速。単位は入力データと同じ
  • Wdir : array_like
    • 風向[degree]

SpdDir_to_UV(Wspd, Wdir)

UV_to_SpdDirの逆で、風向風速から風のUV成分を計算します。風速の単位は m/s, knot など速度の単位なら何でもOKです。

引数(Parameters) :

  • Wspd : array_like
    • 風速[m/s, kt, ...etc]
  • Wdir : array_like
    • 風向[degree]

戻り値(Returns) :

  • U : array_like
    • 風のU成分(東西風成分)
  • V : array_like
    • 風のV成分(南北風成分)

Deg_to_Dir8(Wdir, dir_zero=None, numeric=False)

風向を360度から8方位に変換します。
戻り値は「北・北東・東・南東・南・南西・西・北西」の8方位を表すアルファベット「N・NE・E・SE・S・SW・W・NW」に変換されます。
風向0の場合は、引数dir_zeroで指定した文字列に変換されます。デフォルトはNoneですが、例えば航空気象の場合に、風向が定まらない状態を表す「VRB」に変換する使い方ができます。

また引数numericをTrueにすると、数値「8・1・2・3・4・5・6・7」で出力します。このとき真北は0ではなく8となります。風向0の場合に出力0となります。

引数(Parameters) :

  • Wdir : array_like
    • 360度の風向[degree]
  • dir_zero : str, optional
    • 風向0の場合に変換する文字列を指定。デフォルトはNone
  • numeric : bool, optional
    • 8方位を表すアルファベットで出力されるか(False)、数値で出力させるか(True)を指定。デフォルトはFalse

戻り値(Returns) :

  • Dir8 : array_like
    • 8方位表記の風向

Deg_to_Dir16(val, dir_zero=None, numeric=False)

Deg_to_Dir8のように、風向を360度から16方位に変換します。
すなわち戻り値は「北・北北東・北東・東北東・東・東南東・南東・南南東・南・南南西・南西・西南西・西・西北西・北西・北北西」の16方位を表すアルファベット「N・NNE・NE・ENE・E・ESE・SE・SSE・S・SSW・SW・WSW・W・WNW・NW・NNW」に変換されます。

また引数numericをTrueにすると、数値「16・1・2・3・4・5・6・7・8・9・10・11・12・13・14・15」で出力します。風向0の扱いはDeg_to_Dir8と同じです。

引数(Parameters) :

  • Wdir : array_like
    • 360度の風向[degree]
  • dir_zero : str, optional
    • 風向0の場合に変換する文字列を指定。デフォルトはNone
  • numeric : bool, optional
    • 16方位を表すアルファベットで出力されるか(False)、数値で出力させるか(True)を指定。デフォルトはFalse

戻り値(Returns) :

  • Dir16 : array_like
    • 16方位表記の風向

Cross_Wind(Wspd, Wdir, RWY)

風速・風向・空港の滑走路の向きから、風の横風成分(Cross Wind)を計算します。
風速の単位は m/s, knot など速度の単位なら何でもOKです。風向の単位は degree です。
滑走路は2桁のRWY番号ではなく、360度で与えます。例えばRWY22であれば、220度を入力します。

引数(Parameters) :

  • Wspd : array_like
    • 風速[m/s, kt, ...etc]
  • Wdir : array_like
    • 風向[degree]
  • RWY : array_like
    • 滑走路の向き(360度方位)

戻り値(Returns) :

  • crswind : array_like
    • 風の横風成分の風速

Tail_Wind(Wspd, Wdir, RWY)

風速・風向・空港の滑走路の向きから、風の追い風成分(Tail Wind)を計算します。その他は Cross_Wind に同じです。

引数(Parameters) :

  • Wspd : array_like
    • 風速[m/s, kt, ...etc]
  • Wdir : array_like
    • 風向[degree]
  • RWY : array_like
    • 滑走路の向き(360度方位)

戻り値(Returns) :

  • tailwind : array_like
    • 風の追い風成分の風速

Head_Wind(Wspd, Wdir, RWY)

風速・風向・空港の滑走路の向きから、風の向かい風成分(Head Wind)を計算します。Tail_Windの正負を反対にした値に一致します。その他、Cross_Wind に同じです。

引数(Parameters) :

  • Wspd : array_like
    • 風速[m/s, kt, ...etc]
  • Wdir : array_like
    • 風向[degree]
  • RWY : array_like
    • 滑走路の向き(360度方位)

戻り値(Returns) :

  • headwind : array_like
    • 風の向かい風成分の風速

大気中の水分量を扱う関数

RH_to_Td(T, RH, formula="Bolton")

気温[C]と相対湿度[%]から、露点温度[C]を計算します。相対湿度は0%だと計算ができないので、0.1%が最小値となるように変換されます。
計算過程で飽和水蒸気圧[hPa]の計算をしますが、計算式が3種類あります。デフォルトはBoltonの式を使用しますが、オプションでTetensの式、WMO近似式も指定可能です。
詳しくはT_to_WVPを参照して下さい。

引数(Parameters) :

  • T : array_like
    • 気温[C]
  • RH : array_like
    • 相対湿度[%]
  • formula : str, optional (default="Bolton")
    • 飽和水蒸気圧[hPa]の計算式。"Bolton" の他に、"Tetens", "WMO"を指定可能

戻り値(Returns) :

  • Td : array_like
    • 露点温度[C]

Td_to_RH(T, Td, formula="Bolton")

RH_to_Tdの逆で、気温[C]と露点温度[C]から、相対湿度[%]を計算します。
その他はRH_to_Tdと同じです。

引数(Parameters) :

  • T : array_like
    • 気温[C]
  • Td : array_like
    • 露点温度[C]
  • formula : str, optional (default="Bolton")
    • 飽和水蒸気圧[hPa]の計算式。"Bolton" の他に、"Tetens", "WMO"を指定可能

戻り値(Returns) :

  • RH : array_like
    • 相対湿度[%]

T_to_WVP(T, formula="Bolton")

気温[C]から飽和水蒸気圧[hPa]を計算します。気温の代わりに露点温度[C]を入力すれば、水蒸気圧[hPa]が計算されます。
計算式は3種類あります。デフォルトはBoltonの式を使います。相当温位を計算する際に、気象庁が採用している計算式で実装しているためです。Theta_eも参照して下さい。
ただ私が確認した限り、実用上はどの式を用いても大差ないので、どれでも好みで良いと思います。個人的にはTetensの式になじみがあります。

Tetensの式 : $$ {\Large es = 6.1078 \times 10^{\left(\frac{7.5 T}{T + 237.3}\right)} } $$
WMO近似式 : $$ {\Large es = e^{\left(19.482 - \frac{4303.4}{T + 243.5}\right)} } $$
Boltonの式 : $$ {\Large es = 6.112 \times e^{\left(\frac{17.67 T}{T + 243.5}\right)} } $$

引数(Parameters) :

  • T : array_like
    • 気温[C](もしくは露点温度[C])
  • formula : str, optional (default="Bolton")
    • 飽和水蒸気圧[hPa]の計算式。"Bolton" の他に、"Tetens", "WMO"を指定可能

戻り値(Returns) :

  • es : array_like
    • 飽和水蒸気圧[hPa](露点温度を入力した場合は水蒸気圧[hPa])

WVP_to_T(es, formula="Bolton")

T_to_WVPの逆関数で、飽和水蒸気圧[hPa]から気温[C]を計算します。水蒸気圧[hPa]を入力すれば露点温度[C]が計算されます。

引数(Parameters) :

  • es : array_like
    • 飽和水蒸気圧[hPa](もしくは水蒸気圧[hPa])
  • formula : str, optional (default="Bolton")
    • 飽和水蒸気圧[hPa]の計算式。"Bolton" の他に、"Tetens", "WMO"を指定可能

戻り値(Returns) :

  • T : array_like
    • 気温[C](水蒸気圧を入力した場合は露点温度[C])

T_Td(T, Td)

気温[C]と露点温度[C]から、湿数[C]を計算します。単純に引き算を実行するだけの関数です。

引数(Parameters) :

  • T : array_like
    • 気温[C]
  • Td : array_like
    • 露点温度[C]

戻り値(Returns) :

  • T-Td : array_like
    • 湿数[C]

Mixing_Ratio(Td, P, formula="Bolton")

露点温度[C]と気圧[hPa]から、混合比[g/g]を計算します。
計算過程で飽和水蒸気圧を計算するので、計算式をformulaオプションで指定できます。オプションの種類はT_to_WVPを参照して下さい。

引数(Parameters) :

  • Td : array_like
    • 露点温度[C]
  • P : array_like
    • 気圧[hPa]
  • formula : str, optional (default="Bolton")
    • 飽和水蒸気圧[hPa]の計算式。"Bolton" の他に、"Tetens", "WMO"を指定可能

戻り値(Returns) :

  • w : array_like
    • 混合比[g/g]

大気不安定度に係る関数

Theta(T, P)

気温[C]と気圧[hPa]から、温位[K]を計算します。

引数(Parameters) :

  • T : array_like
    • 気温[C]
  • P : array_like
    • 気圧[hPa]

戻り値(Returns) :

  • Theta : array_like
    • 温位[K]

Tlcl(T, Td)

気温[K]と露点温度[K]から、持ち上げ凝結高度の気温[K]を計算します。気温と露点温度の単位は[K]で入力する点に注意して下さい。
相当温位の計算過程で使っています。計算式についてはTheta_eも参照して下さい。

$$ {\Large T_{LCL} = \frac{1}{\frac{1}{Td-56}+\frac{ln(T\ /\ Td)}{800}}+56 } $$

引数(Parameters) :

  • T : array_like
    • 気温[K]
  • Td : array_like
    • 露点温度[K]

戻り値(Returns) :

  • Tlcl : array_like
    • 持ち上げ凝結高度の気温[K]

Theta_e(T, Td, P, formula="Bolton")

気温[C]・露点温度[C]・気圧[hPa]から、相当温位[K]を計算します。
相当温位の計算式も複数あるようですが、ここでは気象庁が採用した算出方法に準じています。詳しくはリンク先PDFの最後のページを参照して下さい。

$$ {\large \theta_{e} = T\left(\frac{1000}{P-e}\right)^\frac{R_{d}}{C_{pd}}\left(\frac{T}{T_{LCL}}\right)^{0.28w}exp\left(\left(\frac{3036.0}{T_{LCL}}-1.78\right)w(1+0.448w)\right) } $$

なお上記PDFだと $ R_{d}\ /\ C_{pd} $ の値が 0.2854 となっていますが、通常は 0.2857 だと思います。なぜ 0.2854 なのか、誤植なのか or 理由があるのかまでは把握できていません。実装では 0.2857 を採用しました。

計算過程で飽和水蒸気圧を計算するので、計算式をformulaオプションで指定できます。デフォルトは気象庁の相当温位計算式に倣って"Bolton"としています。オプションの種類はT_to_WVPを参照して下さい。

引数(Parameters) :

  • T : array_like
    • 気温[C]
  • Td : array_like
    • 露点温度[C]
  • P : array_like
    • 気圧[hPa]
  • formula : str, optional (default="Bolton")
    • 飽和水蒸気圧[hPa]の計算式。"Bolton" の他に、"Tetens", "WMO"を指定可能

戻り値(Returns) :

  • Thetae : array_like
    • 相当温位[K]

SSI(P0, P1, T0, T1, Td0, formula="Bolton")

大気不安定指数の代表格、SSIを計算します。
入力は持ち上げる空気の高度の気圧[hPa]・気温[C]・露点温度[C]と、持ち上げた先の高度の気圧[hPa]・気温[C]です。通常SSIは850-500hPaで計算しますが、任意の気圧面での計算が可能です。
計算過程で飽和水蒸気圧を計算するので、計算式をformulaオプションで指定できます。オプションの種類はT_to_WVPを参照して下さい。

引数(Parameters) :

  • P0 : array_like
    • 持ち上げる元の高度の気圧[hPa]
  • P1 : array_like
    • 持ち上げた先の高度の気圧[hPa]
  • T0 : array_like
    • 持ち上げる元の高度の気温[C]
  • T1 : array_like
    • 持ち上げた先の高度の気温[C]
  • Td : array_like
    • 持ち上げる元の高度の露点温度[C]
  • formula : str, optional (default="Bolton")
    • 飽和水蒸気圧[hPa]の計算式。"Bolton" の他に、"Tetens", "WMO"を指定可能

戻り値(Returns) :

  • SSI : array_like
    • SSI

K_Index(T850, Td850, T700, Td700, T500)

大気不安定指数の1つ、K-Indexを計算します。
入力は850hPaの気温[C]と露点温度[C]、700hPaの気温[C]と露点温度[C]、500hPaの気温[C]です。

引数(Parameters) :

  • T850 : array_like
    • 850hPaの気温[C]
  • Td850 : array_like
    • 850hPaの露点温度[C]
  • T700 : array_like
    • 700hPaの気温[C]
  • Td700 : array_like
    • 700hPaの露点温度[C]
  • T500 : array_like
    • 500hPaの気温[C]

戻り値(Returns) :

  • Kindex : array_like
    • K-Index

単位変換

MPS_to_KT(x)

風速など、速度の単位変換です。m/s を knot に変換します。

引数(Parameters) :

  • x : array_like
    • 速度[m/s]

戻り値(Returns) :

  • y : array_like
    • 速度[kt]

KT_to_MPS(x)

風速など、速度の単位変換です。knot を m/s に変換します。

引数(Parameters) :

  • x : array_like
    • 速度[kt]

戻り値(Returns) :

  • y : array_like
    • 速度[m/s]

M_to_FT(x)

高度など、長さの単位変換です。meter を feet に変換します。

引数(Parameters) :

  • x : array_like
    • 長さ[m]

戻り値(Returns) :

  • y : array_like
    • 長さ[ft]

FT_to_M(x)

高度など、長さの単位変換です。feet を meter に変換します。

引数(Parameters) :

  • x : array_like
    • 長さ[ft]

戻り値(Returns) :

  • y : array_like
    • 長さ[m]

degF_to_degC(x)

気温の単位変換です。華氏[F]を摂氏[C]に変換します。

引数(Parameters) :

  • x : array_like
    • 気温[F]

戻り値(Returns) :

  • y : array_like
    • 気温[C]

degC_to_degF(x)

気温の単位変換です。摂氏[C]を華氏[F]に変換します。

引数(Parameters) :

  • x : array_like
    • 気温[C]

戻り値(Returns) :

  • y : array_like
    • 気温[F]

今後のバージョンアップについて

最初に述べたとおり、もともとPerlモジュールとして作ったものを、一通りPythonに書き換えましたので、いったん完成としました。

今後、下記のような気象要素も取り入れていきます。需要があるのかわかりませんが(笑)、気象の専門家のこだわりで作っていきたいと思います。

  1. LFC、CAPE、CIN、Lifted Index など
  2. 移流、渦度、風の鉛直シア、安定度など
  3. 湿球温度、湿球温位など
  4. アメリカで使われているスーパーセル指数(SCP)や竜巻指数(STP)など
Yoshiki443
気象予報士・データサイエンティストです
https://www.weatherdatascience.tokyo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした