예제 #1
0
 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
예제 #2
0
 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()
예제 #3
0
 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()
예제 #4
0
 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()
예제 #5
0
 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)
예제 #6
0
 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()
예제 #7
0
 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)
예제 #8
0
 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)
예제 #9
0
 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()