GPVデータファイルからMetPyで露点温度を求める
この記事は、SDGsの目標13「気候変動に具体的な対策を」をテーマに、気象データの利用方法の普及と気象関連ソリューション開発を促進するためのナレッジを提供することを目的として作成しています。
前回は、MetPyを使って気象庁メソモデル(MSM)から地上の風向と風速を求める方法について解説しました。
今回は、MetPyを使って気象庁メソモデル(MSM)から地上の気温と相対湿度を使って露点温度を求める方法について解説していきます。
目次
GPVデータファイルからMetPyで露点温度を求める
MetPyは、気象データの読み取り、視覚化、および物理計算が可能なPythonのモジュールです。このモジュールを利用したクラスを作成して、再利用できるようにコーディングしていきます。
クラスの作成については、以下の記事もぜひ参考にしてください。
露点温度をなぜ求めるのか
露点温度は、空気中の水蒸気が飽和状態に達して凝結する温度を指します。湿度が100%になると、水蒸気が凝結して露が形成される温度です。農業分野においても重要な指標として扱われることがあります。
気象庁MSMなどの数値予報モデルは、露点温度を直接的に計算していないため、数値予報結果のGRIB2ファイルにも露点温度が含まれていません。そのため、露点温度を求めるには物理量の計算が必要です。
GRIB2ファイルのデータを利用して露点温度を求めるには、PythonのMetPyモジュールが非常に便利です。MetPyは気象データの処理や計算に特化しており、露点温度の計算もサポートしています。
今回は、MetPyを使用して気温と相対湿度から露点温度を求めるクラスを作成していきます。このクラスを通じて、気象データを効果的に解析し、露点温度を取得する方法を学ぶことができます。
温度と相対湿度から露点温度を求めるクラスを作る
ここからは、ある地点の露点温度を気象庁MSMのGRIB2から求めるPythonのコードについて紹介していきます。なお、コードは再利用することを前提としてコーディングしていきます。
クラスコードの全体は以下のとおりです。
import pygrib
import metpy.calc as mpcalc
from metpy.units import units
from datetime import timedelta
class MetPhysModule :
def __init__(self, reflat, reflon, grib2) :
# 抽出する地点の緯度経度と抽出範囲を設定する
self.req_lat1 = reflat - 0.025
self.req_lat2 = reflat + 0.025
self.req_lon1 = reflon - 0.03125
self.req_lon2 = reflon + 0.03125
# GRIB2ファイル名を設定する
self.grib2dat = grib2
# UTCから日本時間に変換するための時刻差を設定する
self.diff_time = timedelta(hours=9)
def extractValidTime(self, physquantity) :
validtime = physquantity.validDate + self.diff_time
return validtime
def extractPointData(self, physquantity) :
pointdata = physquantity.data(
lat1 = self.req_lat1, lat2 = self.req_lat2,
lon1 = self.req_lon1, lon2 = self.req_lon2
)[0][0][0]
return pointdata
def calcDewpoinRhum(self) :
# GPVファイル名を指定してオープンする
gpv_file = pygrib.open(self.grib2dat)
# 気温と相対湿度を取り出す
temp = gpv_file.select(name="Temperature")
rhum = gpv_file.select(name="Relative humidity")
# 予想時刻と抽出した要素データを格納するリストを初期化する
valid_dates = []
tc_list = []
rh_list = []
dewc_list = []
# 気温と相対湿度から露点温度を計算する
for tk, rh in zip(temp, rhum) :
# 予想時刻をリストに抽出する
vt = self.extractValidTime(tk)
valid_dates.append(vt)
# 地点データを抽出する
tc_pt = self.extractPointData(tk) - 273.15
rh_pt = self.extractPointData(rh)
# MetPyで気温と相対湿度から露点温度を算出する
dewc = mpcalc.dewpoint_from_relative_humidity(
tc_pt * units.degC,
rh_pt * units.percent
)
tc_list.append(tc_pt)
rh_list.append(rh_pt)
dewc_list.append(dewc.magnitude)
return valid_dates, dewc_list, tc_list, rh_list
MetPyで露点温度を処理する
風向風速など物理量計算を行うためのmetpy.calcをmpcalcとしてインポートしています。
また、MetPyでは、計算対象の物理量に対して単位を設定しなければならないため、metpy.unitsモジュールもインポートします。これにより、気象データの物理量計算や単位の設定ができるようになります。
import pygrib
import metpy.calc as mpcalc
from metpy.units import units
from datetime import timedelta
次に、予報時刻を抽出するメソッド(extractValidTime)とポイントのデータを抽出するメソッド(extractPointData)を作成します。これらのメソッドは、露点温度を処理するメソッド内で使用します。
def extractValidTime(self, physquantity) :
validtime = physquantity.validDate + self.diff_time
return validtime
def extractPointData(self, physquantity) :
pointdata = physquantity.data(
lat1 = self.req_lat1, lat2 = self.req_lat2,
lon1 = self.req_lon1, lon2 = self.req_lon2
)[0][0][0]
return pointdata
気温と相対湿度から露点温度を処理するメソッド(calcDewpoinRhum)を作成します。
GRIB2ファイルをオープンして、気温と相対湿度のGRIBメッセージを抽出しています。また、予報時刻、気温、相対湿度と露点温度を格納するリストを初期化しています。
def calcDewpoinRhum(self) :
# GPVファイル名を指定してオープンする
gpv_file = pygrib.open(self.grib2dat)
# 気温と相対湿度を取り出す
temp = gpv_file.select(name="Temperature")
rhum = gpv_file.select(name="Relative humidity")
# 予想時刻と抽出した要素データを格納するリストを初期化する
valid_dates = []
tc_list = []
rh_list = []
dewc_list = []
以下では、気温と相対湿度のGRIBメッセージを格納したオブジェクト変数をループさせて、予報時刻、地点の気温と相対湿度を抽出しています。
また、予報時刻はクラス内のextractValidTimeメソッドを呼び出し、気温と相対湿度はextractPointDataメソッドを呼び出しています。気温は、絶対温度から摂氏に単位変換しています。
# 気温と相対湿度から露点温度を計算する
for tk, rh in zip(temp, rhum) :
# 予想時刻をリストに抽出する
vt = self.extractValidTime(tk)
valid_dates.append(vt)
# 地点データを抽出する
tc_pt = self.extractPointData(tk) - 273.15
rh_pt = self.extractPointData(rh)
温度と相対湿度から露点温度を求めるには、metpy.calcモジュールのdewpoint_from_relative_humidityメソッドを使用します。
dewpoint_from_relative_humidityメソッドは、第1引数に気温(℃)、第2引数に相対湿度(%)を与えます。引数に与える気温と相対湿度は、単位を付与してQuantityオブジェクトにします。
地点の気温および相対湿度は、そのままリスト変数に追記しています。計算した地点の露点温度はQuantityオブジェクトになっているため、magnitudeを付与して物理量のみをリスト変数に追記させています。
最後に、計算した露点温度と気温、相対湿度を戻り値としてリターンしています。
# MetPyで気温と相対湿度から露点温度を算出する
dewc = mpcalc.dewpoint_from_relative_humidity(
tc_pt * units.degC,
rh_pt * units.percent
)
tc_list.append(tc_pt)
rh_list.append(rh_pt)
dewc_list.append(dewc.magnitude)
return valid_dates, dewc_list, tc_list, rh_list
露点温度を出力させてみる
MetPyを使って作成したクラスをインポートして、露点温度を出力してみます。Pythonのメインスクリプトは以下のとおりです。
from MetPhysModule import MetPhysModule
import pandas as pd
# 東京駅の緯度経度を設定する
land_lat = 35.681236
land_lon = 139.767125
# 気象庁MSMのGRIB2ファイル名を指定する
msm_gpv ='Z__C_RJTD_20240217000000_MSM_GPV_Rjp_Lsurf_FH00-15_grib2.bin'
# MetPhysModuleクラスをインスタンス化する
calcphys = MetPhysModule(land_lat, land_lon, msm_gpv)
# calcWindDataメソッドを実行して、予報時刻、風向および風速のリスト変数を取得する
#vt, wdir, wspd = calcphys.calcWindData()
# calcDewpoinRhumメソッドを実行して、予報時刻、露点温度、気温および相対湿度のリスト変数を取得する
vt, dewc, tc, rh = calcphys.calcDewpoinRhum()
# 予報時刻、露点温度、気温および相対湿度のリスト変数をPandasのデータフレームに入力する
df = pd.DataFrame({
"ValidTime":vt,
"Dewpoint":dewc,
"Tenm C":tc,
"RelHum %":rh
})
print(df)
スクリプトを実行すると、以下のように出力されます。
(MetPy) [reafnex@devsrv01 MetPy]$ python3.12 main.py
ValidTime Dewpoint Temp C RelHum %
0 2024-02-17 09:00:00 -2.859045 4.093698 60.526361
1 2024-02-17 10:00:00 -1.773936 5.921289 57.743395
2 2024-02-17 11:00:00 -0.410344 7.540704 57.086926
3 2024-02-17 12:00:00 0.733847 8.934076 56.423819
4 2024-02-17 13:00:00 1.713427 10.017114 56.286346
5 2024-02-17 14:00:00 2.541332 10.877588 56.378304
6 2024-02-17 15:00:00 3.189641 11.440454 56.866016
7 2024-02-17 16:00:00 3.607913 11.754785 57.365187
8 2024-02-17 17:00:00 4.153312 11.240320 61.671747
9 2024-02-17 18:00:00 4.752715 10.196832 68.940678
10 2024-02-17 19:00:00 4.810262 9.435266 72.844540
11 2024-02-17 20:00:00 4.825103 8.759485 76.319902
12 2024-02-17 21:00:00 4.781057 8.139917 79.348927
13 2024-02-17 22:00:00 4.601171 7.695764 80.763300
14 2024-02-17 23:00:00 4.501389 7.210321 82.906273
15 2024-02-18 00:00:00 4.294541 6.890558 83.524918
湿度(RelHum %)が高いほど露点温度(Dewpoint)は気温(Temp C)に近づき、低ければ離れていることが確認できました。
まとめ
いかがでしたでしょうか。
今回は、PythonのPygribモジュールを利用して気象庁MSMのGRIB2から特定地点の気温と相対湿度を抽出し、MetPyモジュールを利用して露点温度を求めるコードを紹介しました。
気象庁MSMなどの数値予報モデルは、露点温度を直接的に計算していないため、物理量計算して求める必要がありますが、MetPyは露点温度の計算もサポートしているため、気象学の知識がなくても簡単に求めることができます。
この他にも、気圧と比湿から露点温度を求めたり、水蒸気圧から露点温度を求めたりするメソッドも備わっています。また、気温と露点温度から相対湿度を求めるメソッドもあり、MetPyは気象データ解析の分野でかなり実用性が高いと言えます。
今後もMetPyモジュールを利用した気象物理量の求め方とPythonコードについて紹介していこうとおもいます。
参考になれば幸いです。
気象データ利用のお悩みについてご相談ください
気象システムの設計製造及び運用保守にかかわる現役システムエンジニアが、気象予報士の視点で気象データを活用したビジネスアイディアの創出と課題解決のお手伝いをさせていただきます。
気象や波浪などの数値予報モデルを活用した気象予報システム開発や運用についても是非ご相談ください。