diff --git a/pyresample/bucket/__init__.py b/pyresample/bucket/__init__.py index 6ea45d768..532d2da27 100644 --- a/pyresample/bucket/__init__.py +++ b/pyresample/bucket/__init__.py @@ -200,13 +200,17 @@ def _get_indices(self): target_shape = self.target_area.shape self.idxs = self.y_idxs * target_shape[1] + self.x_idxs - def get_sum(self, data, skipna=True): + def get_sum(self, data, fill_value=np.nan, skipna=True): """Calculate sums for each bin with drop-in-a-bucket resampling. Parameters ---------- data : Numpy or Dask array Data to be binned and summed. + fill_value : float + Fill value to mark missing/invalid values in the input data, + as well as in the binned and averaged output data. + Default: np.nan skipna : boolean (optional) If True, skips NaN values for the sum calculation (similarly to Numpy's `nansum`). Buckets containing only NaN are set to zero. @@ -241,6 +245,10 @@ def get_sum(self, data, skipna=True): # TODO remove following line in favour of weights = data when dask histogram bug (issue #6935) is fixed sums = self._mask_bins_with_nan_if_not_skipna(skipna, data, out_size, sums) + # set bin without data to fill_value if fill_value exists + if ~np.isnan(fill_value): + sums = da.where(sums == 0, fill_value, sums) + return sums.reshape(self.target_area.shape) def _mask_bins_with_nan_if_not_skipna(self, skipna, data, out_size, statistic): @@ -251,7 +259,7 @@ def _mask_bins_with_nan_if_not_skipna(self, skipna, data, out_size, statistic): statistic = da.where(nan_bins > 0, np.nan, statistic) return statistic - def _call_bin_statistic(self, statistic_method, data, fill_value=None, skipna=None): + def _call_bin_statistic(self, statistic_method, data, fill_value=np.nan, skipna=None): """Calculate statistics (min/max) for each bin with drop-in-a-bucket resampling.""" if isinstance(data, xr.DataArray): data = data.data @@ -268,6 +276,8 @@ def _call_bin_statistic(self, statistic_method, data, fill_value=None, skipna=No shape=out_shape, dtype=np.float64) + # set bin without data to fill_value + statistics = da.where(np.isin(statistics, (0, fill_value)), fill_value, statistics) return statistics def get_min(self, data, fill_value=np.nan, skipna=True):