def _maybe_convert_timedelta(self, other): """ Convert timedelta-like input to an integer multiple of self.freq Parameters ---------- other : timedelta, np.timedelta64, DateOffset, int, np.ndarray Returns ------- converted : int, np.ndarray[int64] Raises ------ IncompatibleFrequency : if the input cannot be written as a multiple of self.freq. Note IncompatibleFrequency subclasses ValueError. """ if isinstance(other, (timedelta, np.timedelta64, Tick, np.ndarray)): if isinstance(self.freq, Tick): # _check_timedeltalike_freq_compat will raise if incompatible delta = self._data._check_timedeltalike_freq_compat(other) return delta elif isinstance(other, BaseOffset): if other.base == self.freq.base: return other.n raise raise_on_incompatible(self, other) elif is_integer(other): # integer is passed to .shift via # _add_datetimelike_methods basically # but ufunc may pass integer to _add_delta return other # raise when input doesn't have freq raise raise_on_incompatible(self, None)
def _assert_can_do_setop(self, other): super()._assert_can_do_setop(other) # *Can't* use PeriodIndexes of different freqs # *Can* use PeriodIndex/DatetimeIndex if isinstance(other, PeriodIndex) and self.freq != other.freq: raise raise_on_incompatible(self, other)
def searchsorted(self, value, side="left", sorter=None): if isinstance(value, Period): if value.freq != self.freq: raise raise_on_incompatible(self, value) value = value.ordinal elif isinstance(value, str): try: value = Period(value, freq=self.freq).ordinal except DateParseError: raise KeyError(f"Cannot interpret '{value}' as period") return self._ndarray_values.searchsorted(value, side=side, sorter=sorter)
def asof_locs(self, where, mask: np.ndarray) -> np.ndarray: """ where : array of timestamps mask : array of booleans where data is not NA """ where_idx = where if isinstance(where_idx, DatetimeIndex): where_idx = PeriodIndex(where_idx._values, freq=self.freq) elif not isinstance(where_idx, PeriodIndex): raise TypeError("asof_locs `where` must be DatetimeIndex or PeriodIndex") elif where_idx.freq != self.freq: raise raise_on_incompatible(self, where_idx) locs = self.asi8[mask].searchsorted(where_idx.asi8, side="right") locs = np.where(locs > 0, locs - 1, 0) result = np.arange(len(self))[mask].take(locs) first = mask.argmax() result[(locs == 0) & (where_idx.asi8 < self.asi8[first])] = -1 return result