Source code for hydromt_wflow.workflows.forcing
"""Forcing workflow for wflow."""
import logging
from typing import Optional
import numpy as np
import xarray as xr
from hydromt.workflows.forcing import resample_time
logger = logging.getLogger(__name__)
__all__ = ["pet"]
[docs]
def pet(
pet: xr.DataArray,
ds_like: xr.Dataset,
freq: str = "D",
mask_name: Optional[str] = None,
chunksize: Optional[int] = None,
logger: Optional[logging.Logger] = logger,
) -> xr.DataArray:
"""
Resample and reproject PET to the grid of ds_like.
Parameters
----------
pet : xr.DataArray
PET data array with time as first dimension.
ds_like : xr.Dataset
Dataset with the grid to reproject to.
freq : str, optional
Resampling frequency, by default "D".
mask_name : str, optional
Name of the mask variable in ds_like, by default None.
chunksize : int, optional
Chunksize for the time dimension for resampling, by default None to use default
time chunk.
Returns
-------
pet_out : xr.DataArray
Resampled and reprojected PET data array.
"""
if chunksize is not None:
pet = pet.chunk({"time": chunksize})
if pet.raster.dim0 != "time":
raise ValueError(f'First pet dim should be "time", not {pet.raster.dim0}')
# change nodata
pet = pet.where(pet != pet.raster.nodata, np.nan)
pet.raster.set_nodata(np.nan)
# Minimum is zero
pet_out = np.fmax(pet.raster.reproject_like(ds_like, method="nearest_index"), 0)
# resample time
resample_kwargs = dict(label="right", closed="right")
if freq is not None:
resample_kwargs.update(upsampling="bfill", downsampling="sum", logger=logger)
pet_out = resample_time(pet_out, freq, conserve_mass=True, **resample_kwargs)
# Mask
if mask_name is not None:
mask = ds_like[mask_name].values > 0
pet_out = pet_out.where(mask, pet_out.raster.nodata)
# Attributes
pet_out.name = "pet"
pet_out.attrs.update(unit="mm")
return pet_out