def daily_temperature_range(self, X1: Union[xr.DataArray, xr.Dataset], X2: Union[xr.DataArray, xr.Dataset] = None, min_varname='MINT', max_varname='MAXT'): X1_arr = utils.data_array_or_dataset_var(X1, var=min_varname) X2_arr = utils.data_array_or_dataset_var(X2, var=max_varname) X_min_arr = utils.resample_daily(X1_arr, lambda x: x.min(), time_dim=self.time_dim) X_max_arr = utils.resample_daily(X2_arr, lambda x: x.max(), time_dim=self.time_dim) return X_max_arr - X_min_arr
def prcptot(self, X: Union[xr.DataArray, xr.Dataset], period='1y', varname='PRCP'): """ Total precipitation over 'period' (default: annual) """ X_arr = utils.data_array_or_dataset_var(X, var=varname) X_arr = utils.resample_daily(X_arr, lambda x: x.sum(), time_dim=self.time_dim) return X_arr.resample({self.time_dim: period}).sum()
def monthly_rx5day(self, X: Union[xr.DataArray, xr.Dataset], varname='PRCP'): """ Monthly maximum 5-day precipitation """ X_arr = utils.data_array_or_dataset_var(X, var=varname) X_arr = utils.resample_daily(X_arr, lambda x: x.sum(), time_dim=self.time_dim) return X_arr.rolling({self.time_dim: 5}, min_periods=1, center=True).sum().resample({self.time_dim: '1M'}).max()
def monthly_rx1day(self, X: Union[xr.DataArray, xr.Dataset], varname='PRCP'): """ Monthly maximum 1-day precipitation """ X_arr = utils.data_array_or_dataset_var(X, var=varname) X_arr = utils.resample_daily(X_arr, lambda x: x.sum(), time_dim=self.time_dim) return X_arr.resample({self.time_dim: '1M'}).max()
def annual_rnmm(self, X: Union[xr.DataArray, xr.Dataset], nmm, varname='PRCP'): """ Annual count of days when precipitation exceeds n mm. """ def _count_rnmm(x, axis): return np.sum(x >= self.convert_units_fn(nmm), axis=axis) X_arr = utils.data_array_or_dataset_var(X, var=varname) X_arr = utils.resample_daily(X_arr, lambda x: x.sum(), time_dim=self.time_dim) return X_arr.groupby('Time.year').reduce(_count_rnmm)
def annual_summer_days(self, X: Union[xr.DataArray, xr.Dataset], varname='MAXT'): X_arr = utils.data_array_or_dataset_var(X, var=varname) X_arr = utils.resample_daily(X_arr, lambda x: x.max(), time_dim=self.time_dim) return (X_arr > self.convert_units_fn(25.0)).astype( X_arr.dtype).groupby(f'{self.time_dim}.year').sum()
def cwd(self, X: Union[xr.DataArray, xr.Dataset], period='1M', varname='PRCP'): """ Number of consecutive wet days in 'period' (default: monthly) """ def _cwd(x, axis): has_precip = x >= self.convert_units_fn(1.0) return utils.max_consecutive_count(has_precip) X_arr = utils.data_array_or_dataset_var(X, var=varname) X_arr = utils.resample_daily(X_arr, lambda x: x.sum(), time_dim=self.time_dim) return X_arr.resample({self.time_dim: period}).reduce(_cwd, dim=self.time_dim)
def sdii(self, X: Union[xr.DataArray, xr.Dataset], period='1M', varname='PRCP'): """ Simple precipitation intensity index. Ratio of total precipitation of period to the number of wet days. """ def _sdii(x, axis): # count wet days has_precip = x >= self.convert_units_fn(1.0) return np.sum(np.where(has_precip, x, 0.0), axis=axis) / np.sum(has_precip.astype(np.float32), axis=axis) X_arr = utils.data_array_or_dataset_var(X, var=varname) X_arr = utils.resample_daily(X_arr, lambda x: x.sum(), time_dim=self.time_dim) return X_arr.resample({self.time_dim: period}).reduce(_sdii, dim=self.time_dim)
def monthly_tnn(self, X: Union[xr.DataArray, xr.Dataset], varname=None): X_arr = utils.data_array_or_dataset_var(X, var=varname) X_arr = utils.resample_daily(X_arr, lambda x: x.min(), time_dim=self.time_dim) return X.resample({self.time_dim: '1M'}).min()