From 17ba52866171bf86a4b475e3ba27973b1985beb7 Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 25 Jun 2021 13:18:52 -0700 Subject: [PATCH] REF: share Index.join --- pandas/core/indexes/base.py | 14 +++++++++++ pandas/core/indexes/datetimelike.py | 37 ++--------------------------- 2 files changed, 16 insertions(+), 35 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 6219aa07478d7..e437099572d75 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -3870,6 +3870,7 @@ def _reindex_non_unique( # -------------------------------------------------------------------- # Join Methods + @final @_maybe_return_indexers def join( self, @@ -3901,6 +3902,19 @@ def join( self_is_mi = isinstance(self, ABCMultiIndex) other_is_mi = isinstance(other, ABCMultiIndex) + if isinstance(self, ABCDatetimeIndex) and isinstance(other, ABCDatetimeIndex): + if (self.tz is None) ^ (other.tz is None): + # Raise instead of casting to object below. + raise TypeError("Cannot join tz-naive with tz-aware DatetimeIndex") + + if not self._is_multi and not other._is_multi: + # We have specific handling for MultiIndex below + pself, pother = self._maybe_promote(other) + if pself is not self or pother is not other: + return pself.join( + pother, how=how, level=level, return_indexers=True, sort=sort + ) + lindexer: np.ndarray | None rindexer: np.ndarray | None diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 7afcb4f5b6978..969974e864cf8 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -505,6 +505,8 @@ class DatetimeTimedeltaMixin(DatetimeIndexOpsMixin): _is_monotonic_decreasing = Index.is_monotonic_decreasing _is_unique = Index.is_unique + _join_precedence = 10 + def _with_freq(self, freq): arr = self._data._with_freq(freq) return type(self)._simple_new(arr, name=self._name) @@ -678,38 +680,3 @@ def _union(self, other, sort): return result else: return super()._union(other, sort=sort)._with_freq("infer") - - # -------------------------------------------------------------------- - # Join Methods - _join_precedence = 10 - - def join( - self, - other, - how: str = "left", - level=None, - return_indexers: bool = False, - sort: bool = False, - ): - """ - See Index.join - """ - pself, pother = self._maybe_promote(other) - if pself is not self or pother is not other: - return pself.join( - pother, how=how, level=level, return_indexers=return_indexers, sort=sort - ) - - self._maybe_utc_convert(other) # raises if we dont have tzawareness compat - return Index.join( - self, - other, - how=how, - level=level, - return_indexers=return_indexers, - sort=sort, - ) - - def _maybe_utc_convert(self: _T, other: Index) -> tuple[_T, Index]: - # Overridden by DatetimeIndex - return self, other