作業途中の暫定メモです。たびたび書きかえることになるでしょう。

気象庁のウィンドプロファイラのデータを読む (Python による試作、暫定メモ)

気象庁では、ウィンドプロファイラによる気象観測をしている。 熊谷地方気象台はその観測点のひとつである。 気象庁のウィンドプロファイラ観測の解説はこのページにある。

また、気象庁ウェブサイトの防災情報のページで、最近48時間の観測値を見ることができる。

しかし、(地上気象観測ややラジオゾンデ観測のデータが「各種データ・資料 > 過去の気象データ観測」 で見られるのとちがって) 過去のウィンドプロファイラ観測データは、気象庁ウェブサイトには見あたらない。

気象業務支援センターでは、気象庁のウィンドプロファイラ観測データを、 有料で、リアルタイム配信している。

京都大学 生存圏研究所では、気象業務支援センターから配信されたデータをアーカイブして 教育研究機関向けに提供している。

上記ウェブページの「ウィンドプロファイラ観測データ」というリンクのさきに、 年、月、日の階層のディレクトリがあり、 1日ごとに24個 (1時間ごと) のデータのtar.gz ファイルがある。 tar.gz を展開すると、1時点ごとに 10個のファイルがある (各ファイルが 3~4か所の観測点の観測値をふくんでいる。) ファイルは1時間ごとにまとめられているが、6個の10分値がふくまれている。

(tar.gz を展開して出てくる) データの形式は、 最初に18バイト (22バイトになっている可能性もある) の配信ヘッダがついているほかは、 WMO (世界気象機関) でさだめられた BUFR という形式である。 (現在は BUFR 第4版にもとづいている。2018年のある時点までは第3版にもとづいていた。)

データ形式については、まず、(上記の気象業務支援センターのページからリンクされている) 気象庁のつぎのウェブページにある「配信資料に関する仕様」のうちにある 「No13601. ウィンドプロファイラ観測データ」 (最終更新日 R2.6.2) のPDFファイルを参照する。

また、気象庁のつぎのウェブページにある 「国際気象通報式 別冊 第34号」(PDFファイル) の うち「第3節に関するBUFR表」にふくまれる いくつかの表も参照する必要があった。 (数値を得るのに、記録された整数値に、オフセット値をたしてから、けたをずらす必要があることがあるが、 オフセット値の情報が「配信資料に関する仕様」の文書になかった。)

BUFR の解読には、豊田 英司 さん (気象庁職員だが個人でつくっているページ) の情報も参考にした。

豊田さんは、Ruby 言語で BUFR を解読するプログラム bufrconv をつくっている。

Python で BUFR を読む方法をウェブ検索すると、 PyBufrKit というプログラムがみつかった。作者は Yang Wang さんらしい。

しかしここでは、BUFR 一般の解読はねらわず、 気象庁ウィンドプロファイラ観測データを読むことだけをねらって、 配信データの仕様書を順に読みながら、 試行錯誤的に解読してみた。試作プログラムをここにつける。

入力データとして IUPC43_RJTD_130800_202107130816091_001.send (熊谷で雷雨のあった 2021年 7月 13日 日本時間 17時 (世界時 8時) までの1時間の 熊谷、水戸、勝浦の3地点のデータ) を あたえたときの出力データはこのようになった。

これをもとに、多地点・多時刻のデータをつづけて読み、 単純な表を内容とするスペースくぎりテキスト形式に変換して書き出すプログラムをつくった。 (観測地点の緯度・経度・高さなどの情報は省略している。)

tar.gz の内容を展開したディレクトリで、「ls -1 *.send > ls1」を実行し (オプションの文字は数字の1であり、エルではない)、 Python プログラムではその ls1 を読んでデータファイル名を得る。

そして、 「python3 read_jma_wp_v20210802.py > read_jma_wp_v20210802_out.txt」 のような形で実行する。

2021年7月13日 (世界時) の1日ぶんの全国のデータを読ませたときの 出力テキストファイルを zip アーカイブしてリンクしておく。

出力の内容の小部分 (熊谷の 世界時 8時 0分までの 10分値) をつぎにしめす。

2021 7 13 8 0 47626 291 128 -0.7 -0.5 -3.14 33
2021 7 13 8 0 47626 582 128 -1.8 1.4 -2.51 42
2021 7 13 8 0 47626 873 128 -0.2 1.2 -1.68 47
2021 7 13 8 0 47626 1164 255 9999 9999 9999 9999
2021 7 13 8 0 47626 1455 128 -0.3 2.0 -4.88 55
2021 7 13 8 0 47626 1747 128 0.3 1.6 -5.49 58
2021 7 13 8 0 47626 2038 128 -2.1 0.3 -5.16 59
2021 7 13 8 0 47626 2329 2 -1.6 -5.8 -4.68 60
2021 7 13 8 0 47626 2620 128 -2.4 2.3 -4.18 63
2021 7 13 8 0 47626 2911 128 -0.4 1.6 -3.51 62
2021 7 13 8 0 47626 3202 2 0.5 -0.2 -2.68 62
2021 7 13 8 0 47626 3493 2 7.9 0.9 -2.22 62
2021 7 13 8 0 47626 3784 255 9999 9999 9999 9999
2021 7 13 8 0 47626 4075 128 -4.3 -2.4 -4.5 58
2021 7 13 8 0 47626 4366 128 -3.1 -1.5 -3.83 56
2021 7 13 8 0 47626 4657 128 -3.4 -1.8 -3.79 57

各列の意味はつぎのとおり (左端を1列めとした)。

第4節の解読ではビット単位のあつかいが必要なので、 NumPy の unpackbits をつかった。 しかし、その逆変換の packbits は、わたしが期待したような動作をしてくれなかったので、 2進数の各けたをたしあわせる手つづき int_from_bits を自作した。

ここで読んだ配信データは BUFR 第4版準拠なので、 BUFR 第3版準拠だった時期のデータについてはプログラムの変更が必要かもしれない。 また、配信ヘッダの長さは 18バイトと決めうちしてしまったが、 再配信のばあいは 22バイトになっているとのことなので、対策が必要かもしれない。


2021-08-01, 2021-08-02, 2023-08-06
増田 耕一 (MASUDA Kooiti)
[計算機を利用した気象分野の実習の教材]
立正大学用 [B, F, G 合同セミナーのページ] [セミナーFのページ]