def get_daily_events(da: xr.DataArray, da_value: float, operator: str) -> xr.DataArray: r"""Return a 0/1 mask when a condition is True or False. the function returns 1 where operator(da, da_value) is True 0 where operator(da, da_value) is False nan where da is nan Parameters ---------- da : xr.DataArray da_value : float operator : {">", "<", ">=", "<=", "gt", "lt", "ge", "le"} Logical operator {>, <, >=, <=, gt, lt, ge, le}. e.g. arr > thresh. Returns ------- xr.DataArray """ from xarray.core.ops import get_op if operator in binary_ops: op = binary_ops[operator] elif operator in binary_ops.values(): op = operator else: raise ValueError(f"Operation `{operator}` not recognized.") func = getattr(da, "_binary_op")(get_op(op)) events = func(da, da_value) * 1 events = events.where(~(np.isnan(da))) events = events.rename("events") return events
def threshold_count( da: xr.DataArray, op: str, thresh: float, freq: str ) -> xr.DataArray: """Count number of days above or below threshold. Parameters ---------- da : xr.DataArray Input data. op : str Logical operator {>, <, >=, <=, gt, lt, ge, le }. e.g. arr > thresh. thresh : float Threshold value. freq : str Resampling frequency defining the periods defined in http://pandas.pydata.org/pandas-docs/stable/timeseries.html#resampling. Returns ------- xr.DataArray The number of days meeting the constraints for each period. """ from xarray.core.ops import get_op if op in binary_ops: op = binary_ops[op] elif op in binary_ops.values(): pass else: raise ValueError(f"Operation `{op}` not recognized.") func = getattr(da, "_binary_op")(get_op(op)) c = func(da, thresh) * 1 return c.resample(time=freq).sum(dim="time")
def compare(da: xr.DataArray, op: str, thresh: Union[float, int]) -> xr.DataArray: """Compare a dataArray to a threshold using given operator. Parameters ---------- da : xr.DataArray Input data. op : {">", "<", ">=", "<=", "gt", "lt", "ge", "le"} Logical operator {>, <, >=, <=, gt, lt, ge, le }. e.g. arr > thresh. thresh : Union[float, int] Threshold value. Returns ------- xr.DataArray Boolean mask of the comparison. """ from xarray.core.ops import get_op if op in binary_ops: op = binary_ops[op] elif op in binary_ops.values(): pass else: raise ValueError(f"Operation `{op}` not recognized.") func = getattr(da, "_binary_op")(get_op(op)) return func(da, thresh)