9月も終わりだというのに、昼間はまだ30℃近くある。「熱中症、もういいでしょ」と思いたいところだけど、救急搬送は10月まで続く。僕のエージェントに「今日、外で走っても大丈夫?」と聞けるようにしたくて、環境省の熱中症予防情報サイトのデータを取りに行った話をする。
起: 暑さ指数(WBGT)は公開データ
暑さ指数(WBGT)は、気温・湿度・日射・輻射熱から熱中症リスクを表す指標で、環境省が全国の観測所分を公開している。しかもログインもAPIキーもいらない。kurashi-skillの収録条件(ログイン不要・公式データ・読み取りのみ)にぴったりだ。
承: まず旧サービスの404から
検索で上位に来る手順どおり、https://www.wbgt.env.go.jp/prev15WG/dl/yohou_20260926.csv にアクセスしたら404。実況値のURLも404。どうやら直ファイルのCSV配信は終わっていた。
サイトの「データダウンロード」ページを読むと、APIの仕様変更の告知があり、wbgt_data_api_service_manual.pdf(393,925バイト、第1.1版・2026年6月24日掲載)という公式仕様書に行き着いた。現行はAPI v1で、レスポンスはJSONだ。
- 予測値:
https://www.wbgt.env.go.jp/api/v1/getForecastData - 実況値:
https://www.wbgt.env.go.jp/api/v1/getSurveyData - 地点マスタ:
https://www.wbgt.env.go.jp/man15NH/wbgt_point_master-20260515.csv
2026-09-26の実測: 地点マスタは130,112バイトで865地点(+ヘッダ)。UTF-8・BOMつき。予測APIは発表時刻(05/11/17時の1日3回)を指定すると、3時間ごと約57時間先まで返る。東京(地点番号44132)で19件来た。
転: 罠が3ついた
罠1: 値は10倍。 予測APIの forecast_val は "210" のような文字列で、これは21.0℃の意味。うっかり「今日のWBGTは210℃」と答えるところだった。地球が燃える。
罠2: pref_cds はJIS都道府県コードではない。 東京=13と思って pref_cds=13 を渡したら、地点番号13061系(東京ではない)が返ってきた。東京は44。どうやらアメダス観測所番号の上位ブロック番号の体系らしい。HTTP 200で正常にデータが返る分、たちが悪い。都道府県で絞りたいときは、地点マスタで地点番号を引いて wbgt_nos を使うのが安全だ。
罠3: 地点マスタのCSVは, (カンマ+空白)区切り。 ヘッダもデータも各フィールドの先頭に空白が入る。PythonのDictReaderで素直に読むとキーが Latitude になってKeyErrorを食らう。キーをstripしてから使おう。
ついでに、実況APIの推定値には配信ラグがある。未明に前日の特定時刻を絞って取ると空が返ることがある。エラーではないので、日単位で取るのがいい。
結: エージェントが「外、やめとき」を言えるようになった
ここまでを lookup.py にまとめた。地点マスタをキャッシュし、緯度経度から最寄り地点を探して、予測を環境省の5段階(危険31以上/厳重警戒28-31/警戒25-28/注意21-25/ほぼ安全21未満)つきで表示する。
$ python3 heatstroke/lookup.py --lat 35.68 --lon 139.69
# 最寄り: 東京 (44132) 約5.3km
# 発表 2026/09/25 17:00:00 / 地点 44132 / 19件
2026/09/26 09:00:00 20.0℃ ほぼ安全
(2026-09-26実測。9月下旬の東京はもう「ほぼ安全」だった。サービス期間は概ね4月下旬〜10月なので、来春また値が動き出す。)
今日の持ち帰りは3つ。
-
公開データのURLは推測しない。 404が返ったら、そのサイトの公式の仕様書・告知を先に探す。今回はPDFの仕様書が全部答えてくれた。
-
コード系パラメータはJISとは限らない。 渡す前に、答えのわかっている地点(今回なら東京)で往復テストする。200が返っても中身が違う県かもしれない。
-
古い手順は検索上位に残る。 公共データの世界ではサービス刷新がよくある。手順記事の日付と、公式サイトの更新履歴を見る癖をつけたい。