Skip to content

grib2

Generalized GRIB2 Reader using grib2io

Grib2Reader

Bases: GriddedReader

Generalized Reader for GRIB2 files using the grib2io engine.

Source code in monetio/readers/grib2.py
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
@register_reader("grib2")
class Grib2Reader(GriddedReader):
    """
    Generalized Reader for GRIB2 files using the grib2io engine.
    """

    def open_dataset(
        self,
        files: str | list[str],
        engine: str = "grib2io",
        filters: dict | None = None,
        **kwargs,
    ) -> xr.Dataset:
        """
        Reads GRIB2 files using xarray and grib2io.

        Parameters
        ----------
        files : Union[str, List[str]]
            File path, list of paths, or glob pattern.
        engine : str, optional
            The xarray engine to use, by default "grib2io".
        filters : dict, optional
            Filters to pass to the engine (if supported), by default None.
        **kwargs : dict
            Additional arguments passed to xarray.open_mfdataset or the driver.

        Returns
        -------
        xr.Dataset
            The processed GRIB2 dataset.
        """
        if "engine" not in kwargs:
            kwargs["engine"] = engine

        if filters is not None and "backend_kwargs" not in kwargs:
            kwargs["backend_kwargs"] = {"filters": filters}

        # Use the driver to open files
        # XarrayDriver handles S3, multiple files, etc.
        ds = self.driver.open(files, **kwargs)

        # Standardize and Harmonize
        ds = self.harmonize(ds)

        # Update history
        ds = update_history(ds, f"Read GRIB2 data using {engine}.")

        return ds

    def harmonize(self, ds: xr.Dataset) -> xr.Dataset:
        """
        Harmonize GRIB2 metadata to monetio standards.

        Parameters
        ----------
        ds : xr.Dataset
            Input GRIB2 dataset.

        Returns
        -------
        xr.Dataset
            Harmonized dataset.
        """
        # 1. Coordinate Renaming (common in GRIB2)
        rename_dict = {
            "latitude": "latitude",
            "longitude": "longitude",
            "lat": "latitude",
            "lon": "longitude",
            "lat_0": "latitude",
            "lon_0": "longitude",
            "time": "time",
            "valid_time": "time",
            "step": "step",
        }

        actual_rename = {}
        for k, v in rename_dict.items():
            if k in ds.variables or k in ds.dims:
                if v in ds.dims and k != v:
                    continue
                actual_rename[k] = v

        if actual_rename:
            ds = ds.rename(actual_rename)

        # 2. Ensure latitude/longitude are coordinates
        coord_vars = [v for v in ["latitude", "longitude", "time"] if v in ds.variables]
        if coord_vars:
            ds = ds.set_coords(coord_vars)

        # 3. Scientific Hygiene: Strip whitespace from string attributes
        for var in ds.variables:
            for attr, val in ds[var].attrs.items():
                if isinstance(val, str):
                    ds[var].attrs[attr] = val.strip()

        return ds

harmonize(ds)

Harmonize GRIB2 metadata to monetio standards.

Parameters:

Name Type Description Default
ds Dataset

Input GRIB2 dataset.

required

Returns:

Type Description
Dataset

Harmonized dataset.

Source code in monetio/readers/grib2.py
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
def harmonize(self, ds: xr.Dataset) -> xr.Dataset:
    """
    Harmonize GRIB2 metadata to monetio standards.

    Parameters
    ----------
    ds : xr.Dataset
        Input GRIB2 dataset.

    Returns
    -------
    xr.Dataset
        Harmonized dataset.
    """
    # 1. Coordinate Renaming (common in GRIB2)
    rename_dict = {
        "latitude": "latitude",
        "longitude": "longitude",
        "lat": "latitude",
        "lon": "longitude",
        "lat_0": "latitude",
        "lon_0": "longitude",
        "time": "time",
        "valid_time": "time",
        "step": "step",
    }

    actual_rename = {}
    for k, v in rename_dict.items():
        if k in ds.variables or k in ds.dims:
            if v in ds.dims and k != v:
                continue
            actual_rename[k] = v

    if actual_rename:
        ds = ds.rename(actual_rename)

    # 2. Ensure latitude/longitude are coordinates
    coord_vars = [v for v in ["latitude", "longitude", "time"] if v in ds.variables]
    if coord_vars:
        ds = ds.set_coords(coord_vars)

    # 3. Scientific Hygiene: Strip whitespace from string attributes
    for var in ds.variables:
        for attr, val in ds[var].attrs.items():
            if isinstance(val, str):
                ds[var].attrs[attr] = val.strip()

    return ds

open_dataset(files, engine='grib2io', filters=None, **kwargs)

Reads GRIB2 files using xarray and grib2io.

Parameters:

Name Type Description Default
files Union[str, List[str]]

File path, list of paths, or glob pattern.

required
engine str

The xarray engine to use, by default "grib2io".

'grib2io'
filters dict

Filters to pass to the engine (if supported), by default None.

None
**kwargs dict

Additional arguments passed to xarray.open_mfdataset or the driver.

{}

Returns:

Type Description
Dataset

The processed GRIB2 dataset.

Source code in monetio/readers/grib2.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def open_dataset(
    self,
    files: str | list[str],
    engine: str = "grib2io",
    filters: dict | None = None,
    **kwargs,
) -> xr.Dataset:
    """
    Reads GRIB2 files using xarray and grib2io.

    Parameters
    ----------
    files : Union[str, List[str]]
        File path, list of paths, or glob pattern.
    engine : str, optional
        The xarray engine to use, by default "grib2io".
    filters : dict, optional
        Filters to pass to the engine (if supported), by default None.
    **kwargs : dict
        Additional arguments passed to xarray.open_mfdataset or the driver.

    Returns
    -------
    xr.Dataset
        The processed GRIB2 dataset.
    """
    if "engine" not in kwargs:
        kwargs["engine"] = engine

    if filters is not None and "backend_kwargs" not in kwargs:
        kwargs["backend_kwargs"] = {"filters": filters}

    # Use the driver to open files
    # XarrayDriver handles S3, multiple files, etc.
    ds = self.driver.open(files, **kwargs)

    # Standardize and Harmonize
    ds = self.harmonize(ds)

    # Update history
    ds = update_history(ds, f"Read GRIB2 data using {engine}.")

    return ds