見出し画像

Python Xarrayを用いてJRA-3Q気圧面データを読み込むときに困ったことと解決策

寒冷渦ぽむぅ!寒冷渦こと,り〜ちゅあんです.
今回はJRA-3Qをはじめて読み込んだときに困ったこととその解決策を書こうと思います.

環境は
Ubuntu 24.04 LTS
Python 3.12.2
でおこなっています.

JRA-3Qの読み込みに苦労

JRA-3Qはgrib2ファイル形式で提供されており,Pythonの多次元データを扱うXarrayではそのまま読み込むことが難しい.しかし別モジュールのcfgribを用いればxarray.Datasetとして読み込ませることがこちらを参考にして,JRA-55で確認してある.

ここで,JRA-3Qでも同様にできるか試したみた:

import xarray as xr↲
import cfgrib↲

ds = xr.open_dataset("./anl_p125_hgt.2024050100", engine="cfgrib")↲

しかし,つぎのエラーが出現した:

Traceback (most recent call last):
  File "/home/itoshiki/nijigasaki/nijimet/col_may/colmay/lib/python3.12/site-packages/cfgrib/dataset.py", line 695, in build_dataset_components
    dims, data_var, coord_vars = build_variable_components(
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/itoshiki/nijigasaki/nijimet/col_may/colmay/lib/python3.12/site-packages/cfgrib/dataset.py", line 502, in build_variable_components
    data_var_attrs = enforce_unique_attributes(index, DATA_ATTRIBUTES_KEYS, filter_by_keys)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/itoshiki/nijigasaki/nijimet/col_may/colmay/lib/python3.12/site-packages/cfgrib/dataset.py", line 291, in enforce_unique_attributes
    raise DatasetBuildError("multiple values for key %r" % key, key, fbks)
cfgrib.dataset.DatasetBuildError: multiple values for key 'typeOfLevel'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/itoshiki/nijigasaki/nijimet/col_may/jra3q/anl_p125/load_data.py", line 5, in <module>
    ds = xr.open_dataset("./anl_p125_hgt.2024050100", engine="cfgrib")
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/itoshiki/nijigasaki/nijimet/col_may/colmay/lib/python3.12/site-packages/xarray/backends/api.py", line 670, in open_dataset
    backend_ds = backend.open_dataset(
                 ^^^^^^^^^^^^^^^^^^^^^
  File "/home/itoshiki/nijigasaki/nijimet/col_may/colmay/lib/python3.12/site-packages/cfgrib/xarray_plugin.py", line 112, in open_dataset
    store = CfGribDataStore(
            ^^^^^^^^^^^^^^^^
  File "/home/itoshiki/nijigasaki/nijimet/col_may/colmay/lib/python3.12/site-packages/cfgrib/xarray_plugin.py", line 40, in __init__
    self.ds = opener(filename, **backend_kwargs)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/itoshiki/nijigasaki/nijimet/col_may/colmay/lib/python3.12/site-packages/cfgrib/dataset.py", line 828, in open_file
    return open_from_index(index, read_keys, time_dims, extra_coords, errors=errors, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/itoshiki/nijigasaki/nijimet/col_may/colmay/lib/python3.12/site-packages/cfgrib/dataset.py", line 767, in open_from_index
    dimensions, variables, attributes, encoding = build_dataset_components(
                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/itoshiki/nijigasaki/nijimet/col_may/colmay/lib/python3.12/site-packages/cfgrib/dataset.py", line 719, in build_dataset_components
    raise DatasetBuildError(error_message, key, fbks)
cfgrib.dataset.DatasetBuildError: multiple values for unique key, try re-open the file with one of:
    filter_by_keys={'typeOfLevel': 'isobaricInPa'}
    filter_by_keys={'typeOfLevel': 'isobaricInhPa'}

どうやらtypeOfLevelに関して複数の変数があると怒られてしまった.JRA-55ではこうならなかったのに…

エラーにしたがってつぎの作業をしてみた:

ds = xr.open_dataset("./anl_p125_hgt.2024050100", engine="cfgrib",↲
                      backend_kwargs  = {"filter_by_keys": {"typeOfLevel": "isobaricInhPa"}})↲↲

よっしエラーが出ない!さて結果は…

ds
<xarray.Dataset> Size: 7MB
Dimensions:        (isobaricInhPa: 40, latitude: 145, longitude: 288)
Coordinates:
    time           datetime64[ns] 8B ...
    step           timedelta64[ns] 8B ...
  * isobaricInhPa  (isobaricInhPa) float64 320B 1e+03 975.0 950.0 ... 2.0 1.0
  * latitude       (latitude) float64 1kB 90.0 88.75 87.5 ... -87.5 -88.75 -90.0
  * longitude      (longitude) float64 2kB 0.0 1.25 2.5 ... 356.2 357.5 358.8
    valid_time     datetime64[ns] 8B ...
Data variables:
    gh             (isobaricInhPa, latitude, longitude) float32 7MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             rjtd
    GRIB_centreDescription:  Japanese Meteorological Agency - Tokyo
    GRIB_subCentre:          241
    Conventions:             CF-1.7
    institution:             Japanese Meteorological Agency - Tokyo
    history:                 2025-01-03T09:23 GRIB to CDM+CF via cfgrib-0.9.1...

うまくいった!

何が起こっていたか?


公式READMEにこの事象に関してとりあげられていたのでそちらを参照しつつ,

cfgrib.open_datasets("./anl_p125_hgt.2024050100")
[<xarray.Dataset> Size: 839kB
Dimensions:       (isobaricInPa: 5, latitude: 145, longitude: 288)
Coordinates:
    time          datetime64[ns] 8B 2024-05-01
    step          timedelta64[ns] 8B 00:00:00
  * isobaricInPa  (isobaricInPa) float64 40B 70.0 30.0 10.0 3.0 1.0
  * latitude      (latitude) float64 1kB 90.0 88.75 87.5 ... -87.5 -88.75 -90.0
  * longitude     (longitude) float64 2kB 0.0 1.25 2.5 ... 356.2 357.5 358.8
    valid_time    datetime64[ns] 8B ...
Data variables:
    gh            (isobaricInPa, latitude, longitude) float32 835kB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             rjtd
    GRIB_centreDescription:  Japanese Meteorological Agency - Tokyo
    GRIB_subCentre:          241
    Conventions:             CF-1.7
    institution:             Japanese Meteorological Agency - Tokyo, <xarray.Dataset> Size: 7MB
Dimensions:        (isobaricInhPa: 40, latitude: 145, longitude: 288)
Coordinates:
    time           datetime64[ns] 8B 2024-05-01
    step           timedelta64[ns] 8B 00:00:00
  * isobaricInhPa  (isobaricInhPa) float64 320B 1e+03 975.0 950.0 ... 2.0 1.0
  * latitude       (latitude) float64 1kB 90.0 88.75 87.5 ... -87.5 -88.75 -90.0
  * longitude      (longitude) float64 2kB 0.0 1.25 2.5 ... 356.2 357.5 358.8
    valid_time     datetime64[ns] 8B ...
Data variables:
    gh             (isobaricInhPa, latitude, longitude) float32 7MB ...
Attributes:
    GRIB_edition:            2
    GRIB_centre:             rjtd
    GRIB_centreDescription:  Japanese Meteorological Agency - Tokyo
    GRIB_subCentre:          241
    Conventions:             CF-1.7
    institution:             Japanese Meteorological Agency - Tokyo]

どうやら気圧面データにおいてデータセットがふたつあることがわかった.

JRA-3Qの公式ドキュメントに関して気圧面データはつぎのように提供されている:

等圧面は 45 層(1000, 975, 950, 925, 900, 875, 850, 825, 800, 775, 750,
700, 650, 600, 550, 500, 450, 400, 350, 300, 250, 225, 200, 175, 150,
125, 100, 85, 70, 60, 50, 40, 30, 20, 10, 7, 5, 3, 2, 1, 0.7, 0.3, 0.1,
0.03, 0.01hPa)あります。

JRA-3Q データフォーマット
(1.25 度緯度/経度格子データ)

上の出力結果と比較すると,0.01-0.7hPaと10-1000hPaに分けられており,前者の単位はPa,後者はhPaであった.気圧面高度は整数型のみと推測した.

さいごに

JRA-3Qの気圧面データは小数hPa面と整数hPa面のふたつのデータセットに分けられており,そのまま読み込んでしまうとデータの複数性で怒られてしまうため,使用データセットを一致するキーワードでフィルタリングする必要がある.

今後もたびたびエラーに遭遇すると思う…ので報告と解決策を書きます.

いいなと思ったら応援しよう!