気候予測データの解析環境を構築する 番外編― ”wxbcgribx.py”を動かす

はじめに

「気象ビジネス推進コンソーシアム(略称:WXBC)」により、 気象庁のGPVデータを処理し活用する方法を学ぶため、気象庁GPVデータ分析チャレンジ!入門(2023年10月26日)が開催されています。(現在受講中

www.wxbc.jp

事前準備として、” WXBCオリジナルPythonライブラリwxbcgribX”の実行環境を作っておく必要があるとのこと。

www.wxbc.jp

試行錯誤してWSL2-Docker下で動くようにしましたので、紹介します。

wgrib2のコマンドパスの設定

wxbcgribx.pyの36行目に次のパスを設定します

wgrib2 = "docker exec -w /mnt/c/Users/hoge/{作業ディレクトリ} wgrib2_dock wgrib2"
#wgrib2 = Path("C:/wgrib2/wgrib2.exe") # wgrib2のインストール場所 Windowsの場合
#wgrib2 = Path("/usr/local/bin/wgrib2.exe") # wgrib2のインストール場所 Linuxの場合
#wgrib2 = Path("~/work/grib2/wgrib2/wgrib2") # wgrib2のインストール場所 Macの場合

一時フォルダの設定

私の環境では、tempfile.TemporaryDirectory()が動かないので、作業ディレクトリに”tmp"フォルダを作成して、そこを使うように設定します。

def from_grb(grbpath,matchopt,verbose):
    """
    gpvデータをGRIB2ファイルから取得する関数
    matchopt: データを選別するオプション文字列
    """
    #指定した気象要素のデータを取り出して一時ファイルに格納
    with tempfile.TemporaryDirectory() as td:
        Path("./tmp").mkdir(exist_ok = True)  #作業フォルダの作成
        #dumppath = Path(td)/"extracting.nc" #作業ファイルの指定をコメントアウト
        dumppath = "./tmp/extracting.nc" #作業ファイルの指定を修正
        opt = f'{matchopt} -netcdf {dumppath}'
        rc = wg2(grbpath, opt)
        if verbose:
            print(rc.stdout)#.splitlines())
        #一時ファイルからデータセットをロード
        with xr.open_dataset(dumppath) as ds:
            ds.load()
        #dumppath.unlink(missing_ok=True) #後片付けをコメントアウト
    return ds

事前テストのスクリプトが動きました。

これまで構築した、「気候予測データの解析環境」で”wxbcgribx.py”を動かす方法を紹介しました。試してみてくださいね~。

追記:GoogleColabでwgrib2を使うには

講義で出ていたこの質問、

質問です。どうしても、社内では供与PCへのインストールが出来ない環境にあります。GoogleColabでwgrib2を使うにはどうすればよいでしょうか?

調べてみたらこんな記事がありました。

qiita.com

↑この場合、wxbcgribx.pyにおけるwgrib2のコマンドパスは

wgrib2 = "wgrib2" 

でOKだと思います。

ご参考に~

追記2: 「気象庁GPVデータ分析チャレンジ!基礎編」の”wxbcgribx.py”を動かす

本日(2023.11.30)開催の「気象庁GPVデータ分析チャレンジ!基礎編」で配布された”wxbcgribx.py”は、バージョンアップされているようでうまく動かず・・・

73行目からの"wg2"で実行されているエラーチェックをコメントアウトすると動きました。

def wg2(src,opt=''):
    # wgrib2を実行する関数
    #if not wgrib2.exists():
    #    print("wgrib2 をインストールしてください。")
    #    sys.exit()
    check_path(src)
    rc = subprocess.run(f'{wgrib2} {opt} {src}', 
                        shell=True, text=True, capture_output=True)
#    print(rc.returncode)
#    print(rc.stdout)
#    print(rc.stderr)
    return rc