JRA-55から天気図を作成する
これまでは、気象庁GSMのGRIB2形式のデータから天気図を作成してきました。今回は、JRA-55のデータを表示させるために、NetCDF形式のデータ読み込みについて説明します。描画のコードは前回までと変わらないため省いています。
京都大学のサイトでは、気象庁JRA-55のNetCDF形式のデータをユーザー申請するとダウンロードできるようになります。これを利用すると、1955年以降の天気図を描画できるようになります。今回は、この等圧面データの読み込みについてご紹介します。
最後に、以前の記事「ジェット気流と上層発散を把握できる天気図」で作成した同じ天気図のNetCDF版のサンプルコードを添付します。コードの説明は、このサンプルコードを一部切り取っています。実行させるためには、サンプルコードをご利用ください。
NetCDF形式データの読み込み
xarrayを使ってnetCDFデータを読み込みます。xarrayのopen_dataset()を使うと、NetCDF形式のデータをxarray形式のデータセットに直接変換できます。
次のコードでは、まず読み込むデータの時刻や等圧面、データ切り出し領域を指定します。その後、要素(高度、発散など)ごとのNetCDFデータを読み込み、それぞれにデータセットを作成し、指定された時刻・等圧面・領域のみを切り出したデータセットに変換しています。
京都大学からダウンロードしたファイル名は、{TYPE}_{YYYY}{MM}.nc となっています。{TYPE}は、HGT(高度), TMP(気温), DEPR(湿数), UGRD(風速東西成分), VGRD(風速南北成分), STRM(流線関数), VPOT(速度ポテンシャル), VVEL(鉛直速度), RELV(相対渦度)です。{YYYY}は西暦年4桁、{MM}は月2桁です。
## JRA55 netcdf形式データの読み込み処理
import datetime
from dateutil import tz
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import metpy.calc as mpcalc
import metpy.constants as m_const
from metpy.units import units
import numpy as np
import xarray as xr
import scipy.ndimage as ndimage
import scipy.constants as s_const
import sys
import math
#
## 読み込みデータの指定
# JRA55の読み込む年月日時をUTCで与えます。
i_year =1961
i_month = 7
i_day = 15
i_hourZ = 18
# 気圧面を指定
i_pre=300
# データ切り出し領域
lat_cut=slice(80.0,-20.0)
lon_cut=slice(70.0,190.0)
# データ格納先フォルダー名
DataFd="./data/Jra55/"
#
## データ読み込み、データセット作成
# 年月の6桁の整数(文字列)の取得
yyyymm='{:04d}{:02d}'.format(i_year,i_month)
#
## 月別のNetCDF File名
# 高度
HgtFn ='{}HGT_{}.nc'.format(DataFd,yyyymm)
#
## 高度
ds = xr.open_dataset(HgtFn)
dataHgt = ds.metpy.parse_cf('HGT').squeeze()
このデータセットの属性は、データセット名.attrs["units"] などと表記して、アクセスすることができます。下のコードでは、単位を指定しています。
dataHgt.attrs['units'] = 'meter'
データ切り出し
データの切り出しでは、データセット名.isel() あるいは sel()を使います。前者は次元の何番目データを、後者は次元の座標値を指定して切り出せます。
# time番号
time_targ=(i_day - 1) * 4 + i_hourZ // 6
# デー切り出し
dataHgt = dataHgt.isel(time=time_targ)
# 気圧面を指定
i_pre=300
# データ切り出し領域
lat_cut=slice(80.0,-20.0)
lon_cut=slice(70.0,190.0)
# デー切り出し
dataHgt = dataHgt.sel(level=i_pre,
lat=lat_cut,
lon=lon_cut)
参考のために、データセットの次元の文字列、次元のデータサイズ、次元の配列の値について、それぞれのアクセスの方法を下のコードに示します。データセット名.dims、データセット名.sizes、などを使います。
# データセットへのアクセス方法について
## 時刻や座標などの次元の取得
print(dataHgt.dims)
#
# ('time', 'level', 'lat', 'lon')
#
## 次元ごとに、xarray形式の配列の長さを取得し、配列の最後の値を取り出す。
for dim in dataHgt.dims:
size = dataHgt.sizes[dim]
print(dim,' length:',size,' last value:',dataHgt[dim][size - 1].data)
#
# time length: 124 last value: 1961-07-31T18:00:00.000000000
# leve length: 37 last value: 1000.0
# lat length: 145 last value: -90.0
# lon length: 288 last value: 358.75
JRA-55データの時刻を確認する
時刻の取得については、データセット名.time.astype(datetime.datetime)により、int型のUNIX timeが得られます。一方で、pythonのdatetime.datetimeは、Float型であるために、1e-9をかけて変換しています。
## 時刻文字列化
UTC = tz.gettz("UTC")
dt1 = datetime.datetime.fromtimestamp(dataHgt.time.astype(datetime.datetime) * 1e-9, tz=UTC)
dt_str = (dt1.strftime("%HZ%d%b%Y")).upper()
dt_str2 = dt1.strftime("%Y%m%d%H")
print(dt_str)
print(dt_str2)
## 出力
# 18Z15JUL1961
# 1961071518
地衡風などの物理量の計算例
下のコードの通り、これまでの記事で説明した通り、データセットを作成すると、MetPyを使うと簡単に計算することができます。
### 計算
# 地衡風
ug, vg = mpcalc.geostrophic_wind(dataHgt)
# 非地衡風
uag, vag = mpcalc.ageostrophic_wind(dataHgt, dataUgrd, dataVgrd)
# 風速 m/s => knot
dataWS = mpcalc.wind_speed(dataUgrd, dataVgrd)
サンプルコード
ジェット気流解析するための天気図を作図する、Jupyter Notebook用のコードを次からダウンロードできます。JRA-55のNetCDFデータが必要です。
次回は、大気の安定度を表現する天気図について説明する予定です。
この記事が気に入ったらサポートをしてみませんか?