Pythonで拡張アメダス新フォーマット(WEA2)を読む(1)
この記事では拡張アメダスの新フォーマット(WEA2)をPythonを使って読み込む処理についてまとめています。
旧フォーマット(WEA)につては、以前に拡張アメダスをPythonで読み込む例を公開しています。基本的な処理はこちらと同じですが、WEA2の注意点を含めまとめています。
なお、以前の記事では「拡張アメダス気象データ1981-2000」収録の1995年版標準気象データで検証を行っています。
拡張アメダスはいくつかの種類が存在し、若干の差異があります。このあたりの状況はリンク先でまとめています。興味のある方はこちらを参照してください。
※:今回は「標準年EA気象データ2020年版」の関連資料を基に作成しています。資料を確認しながら作成していますが、間違いや不足があればコメントしていただけると幸いです。
拡張アメダスWEA2
さて、そして今回は拡張アメダスの新しいフォーマットWEA2(新版)です。このフォーマットは2020年版から採用されています。
大きくはデータ要素に相対湿度、気圧が追加されて8種類から10種類に増えています。その他、目立つところでは次のような違いがあります。
- 地点番号の扱いの変更
- 日射量の積算範囲の変更
詳しくは後述します。
地点番号
拡張アメダスは、地点番号ごとにデータがブロック分けされて収録されています。従来(1995、2000、2010年版※)では地点番号がそのままブロック番号、つまりファイル上の位置と同義で扱う事が可能でした。
※:2010年版では地点番号が3桁から4桁に変更されていますが、単純に10倍と考えて問題ない構成でした。このため地点番号を1/10することでファイル上の位置に変換することが可能です。例えば、2010年度版で東京の地点番号は3630ですが、これはブロック番号では363と単純な読み替えが可能です。
ところが、2020年版では必ずしも地点番号とブロック番号は一致していないようです。これに伴って地点番号とブロック番号を明確に区別して扱っています。(これ明確に拡張アメダスのドキュメントで明記した箇所が見つけられなかったのですが、サンプルプログラムから推測する限り、そういう意味と考えられます。)
地点番号とブロック番号
地点番号とブロック番号の対応関係は、拡張アメダスに添付されているStninfo_PRY1120.datにまとめられています。図はStninfo_PRY1120.datをExcelに読み込んだ例です。1カラム目が地点番号、8カラム目がそれに対応するブロック番号になっています。
この例だと地点番号を1/10しても良さそうに見えますが、違うケースもあります。この対応関係はプログラムでデータを読み込む時は必ず考慮する必要があります。
ちなみにこのStninfo_PRY1120.datですが、地点名や緯度、経度などの情報も含まれています。地点番号から地図上の位置を確認するのは少々面倒なので、これらのデータを工夫して地図上にプロットしてみましょう。
Python、Plotlyでプロット
実際にやってみたのが下の図です。後述のスクリプトで生成しています。ファイルはHTML形式の出力なので、そのまま載せようかと思いましたが、拡張アメダスの使用許諾に抵触するような気がしたので画像で載せます。
試したい方は後述のソースコードでお試し下さい。
地図を表示するPythonスクリプト
試される方は、予めpandas,Plotlyをインストールしておいてください。
# coding: utf-8
# Example code to read extended AMeDAS, StnInfo_PRY1120.dat.
# author Yuichi Yasuda @ quattro corporate design
# copyright 2024 quattro corporate design. All right reserved.
import pandas as pd
import plotly.offline as offline
import plotly.graph_objs as go
if(__name__ == '__main__'):
# csvファイル、"D:\EAD\StnInfo_PRY1120.dat"をデータフレームとして読み込む
stninfo_file = r"E:\EAD\StnInfo_PRY1120.dat"
stninfo_df = pd.read_csv(stninfo_file, encoding='shift_jis', header=None)
# stninfo_dfのラベルを設定する
stninfo_df.columns = ['ea_no','station_no','intl_location_no','station_name','station_name_kana','pref','pref_kana',
'block_no','latitude','longitude','elevation',
'observed_wind_speed_height','observation_start_date','observation_end_date','corrected_wind_speed_height'
,'station_name_roman','pref_roman']
# 地点名の文字列からブランクを取り除く(トリミングする)
stninfo_df[['station_name','station_name_kana','pref','pref_kana','station_name_roman','pref_roman']] = stninfo_df[['station_name','station_name_kana','pref','pref_kana','station_name_roman','pref_roman']].apply(lambda x: x.str.strip())
# plotly, mapboxで地図を描画する
fig = go.Figure(go.Scattermapbox(
lat=stninfo_df['latitude'],
lon=stninfo_df['longitude'],
mode='markers+text',
marker=go.scattermapbox.Marker(
size=9,
),
# hovertextに地点名、地点番号、ブロック番号を表示する
hovertext=stninfo_df.apply(lambda x: f'{x["station_name"]} <br> 地点番号:{x["ea_no"]} ({x["block_no"]})', axis=1),
hovertemplate='%{hovertext} <br> Lat %{lat}, Lng %{lon}',
name='', # trace nameがhovertextに表示されるのを防ぐ
))
# 地図のスタイルを設定する
fig.update_layout(
mapbox_style="open-street-map",
margin={"r":0,"t":0,"l":0,"b":0},
)
# 日本全体が表示されるように位置調整
center_lat = 36.0
center_lon = 136.0
fig.update_layout(
mapbox = {
'center': {'lat': center_lat, 'lon': center_lon},
'zoom': 4.3},
showlegend = False,)
# 地図を表示する
fig.show()
# htmlファイルとして保存する
# offline.plot(fig, filename='stninfo_map.html', auto_open=True)
日射量の積算範囲の変更
1995,2000,2010年版は正時の前後30分を積算範囲にしています。2020年版(WEA2フォーマット)は直近の1時間に積算範囲が変更されています。
世界的に見ると後者(直近1時間)が一般的なようです。一般的なんですが、うーん、すでに前後30分を前提にしたプログラムがあると変更が必要ですね。
なかなかデータの読み込みにたどり着けないですが、長くなってきたので今回はこの辺までにしておきます。
ということで、次の記事へ続きます。
動作環境
以下の環境で動作を確認しています。
- Windows11 Pro(64bit, 23H2)
- Python 3.11.4
- pandas 2.1.1
- plotly 5.17.0
- 標準年EA気象データ2020年版
1件のピンバック
Pythonで拡張アメダス新フォーマット(WEA2)を読む(2) | 建築環境工学系日記