def high_q_dur(da: DataArray, threshold: float = 9.) -> float: """Calculate high-flow duration. Average duration of high-flow events (number of consecutive steps >`threshold` times the median flow) [#]_, [#]_ (Table 2). Parameters ---------- da : DataArray Array of flow values. threshold : float, optional High-flow threshold. Values larger than ``threshold * median`` are considered high flows. Returns ------- float High-flow duration References ---------- .. [#] Clausen, B. and Biggs, B. J. F.: Flow variables for ecological studies in temperate streams: groupings based on covariance. Journal of Hydrology, 2000, 237, 184--197, doi:10.1016/S0022-1694(00)00306-1 .. [#] Westerberg, I. K. and McMillan, H. K.: Uncertainty in hydrological signatures. Hydrology and Earth System Sciences, 2015, 19, 3951--3968, doi:10.5194/hess-19-3951-2015 """ median_flow = float(da.median()) idx = np.where(da.values > threshold * median_flow)[0] if len(idx) > 0: periods = _split_list(idx) hqd = np.mean([len(p) for p in periods]) else: hqd = np.nan return hqd
def high_q_freq(da: DataArray, coord: str = "date", threshold: float = 9.0) -> float: # determine the date of the first January 1st in the data period first_date = da.coords[coord][0].values.astype("datetime64[s]").astype(datetime) last_date = da.coords[coord][-1].values.astype("datetime64[s]").astype(datetime) if first_date == datetime.strptime(f"{first_date.year}-01-01", "%Y-%m-%d"): start_date = first_date else: start_date = datetime.strptime(f"{first_date.year + 1}-01-01", "%Y-%m-%d") # end date of the first full year period end_date = start_date + relativedelta(years=1) - relativedelta(days=1) # determine the median flow over the entire period median_flow = da.median(skipna=True) hqfs = [] while end_date < last_date: data = da.sel({coord: slice(start_date, end_date)}) # number of days with discharge higher than threshold * median in a one year period n_days = (data > (threshold * median_flow)).sum() hqfs.append(float(n_days)) start_date += relativedelta(years=1) end_date += relativedelta(years=1) return np.mean(hqfs)
def high_q_dur(da: DataArray, threshold: float = 9.) -> float: median_flow = float(da.median()) idx = np.where(da.values > threshold * median_flow)[0] if len(idx) > 0: periods = _split_list(idx) hqd = np.mean([len(p) for p in periods]) else: hqd = np.nan return hqd
def high_q_freq(da: DataArray, datetime_coord: str = None, threshold: float = 9.) -> float: """Calculate high-flow frequency. Frequency of high-flow events (>`threshold` times the median flow) [#]_, [#]_ (Table 2). Parameters ---------- da : DataArray Array of flow values. datetime_coord : str, optional Datetime coordinate in the passed DataArray. Tried to infer automatically if not specified. threshold : float, optional High-flow threshold. Values larger than ``threshold * median`` are considered high flows. Returns ------- float High-flow frequency References ---------- .. [#] Clausen, B. and Biggs, B. J. F.: Flow variables for ecological studies in temperate streams: groupings based on covariance. Journal of Hydrology, 2000, 237, 184--197, doi:10.1016/S0022-1694(00)00306-1 .. [#] Westerberg, I. K. and McMillan, H. K.: Uncertainty in hydrological signatures. Hydrology and Earth System Sciences, 2015, 19, 3951--3968, doi:10.5194/hess-19-3951-2015 """ if datetime_coord is None: datetime_coord = utils.infer_datetime_coord(da) # determine the date of the first January 1st in the data period first_date = da.coords[datetime_coord][0].values.astype( 'datetime64[s]').astype(datetime) last_date = da.coords[datetime_coord][-1].values.astype( 'datetime64[s]').astype(datetime) if first_date == datetime.strptime(f'{first_date.year}-01-01', '%Y-%m-%d'): start_date = first_date else: start_date = datetime.strptime(f'{first_date.year + 1}-01-01', '%Y-%m-%d') # end date of the first full year period end_date = start_date + relativedelta(years=1) - relativedelta(seconds=1) # determine the median flow over the entire period median_flow = da.median(skipna=True) hqfs = [] while end_date < last_date: data = da.sel({datetime_coord: slice(start_date, end_date)}) # number of steps with discharge higher than threshold * median in a one year period n_steps = (data > (threshold * median_flow)).sum() hqfs.append(float(n_steps)) start_date += relativedelta(years=1) end_date += relativedelta(years=1) return np.mean(hqfs)