diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 3a721d8c8c320..cf653a6875a9c 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -2,7 +2,7 @@ Base and utility classes for tseries type pandas objects. """ from datetime import datetime -from typing import Any, List, Optional, Union +from typing import Any, List, Optional, Union, cast import numpy as np @@ -583,6 +583,22 @@ def delete(self, loc): arr = type(self._data)._simple_new(new_i8s, dtype=self.dtype, freq=freq) return type(self)._simple_new(arr, name=self.name) + # -------------------------------------------------------------------- + # Join/Set Methods + + def _wrap_joined_index(self, joined: np.ndarray, other): + assert other.dtype == self.dtype, (other.dtype, self.dtype) + name = get_op_result_name(self, other) + + if is_period_dtype(self.dtype): + freq = self.freq + else: + self = cast(DatetimeTimedeltaMixin, self) + freq = self.freq if self._can_fast_union(other) else None + new_data = type(self._data)._simple_new(joined, dtype=self.dtype, freq=freq) + + return type(self)._simple_new(new_data, name=name) + class DatetimeTimedeltaMixin(DatetimeIndexOpsMixin, Int64Index): """ @@ -878,15 +894,6 @@ def _is_convertible_to_index_for_join(cls, other: Index) -> bool: return True return False - def _wrap_joined_index(self, joined: np.ndarray, other): - assert other.dtype == self.dtype, (other.dtype, self.dtype) - name = get_op_result_name(self, other) - - freq = self.freq if self._can_fast_union(other) else None - new_data = type(self._data)._simple_new(joined, dtype=self.dtype, freq=freq) - - return type(self)._simple_new(new_data, name=name) - # -------------------------------------------------------------------- # List-Like Methods diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index 56cb9e29761a6..957c01c2dca96 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -628,6 +628,7 @@ def join(self, other, how="left", level=None, return_indexers=False, sort=False) other, how=how, level=level, return_indexers=return_indexers, sort=sort ) + # _assert_can_do_setop ensures we have matching dtype result = Int64Index.join( self, other, @@ -636,11 +637,7 @@ def join(self, other, how="left", level=None, return_indexers=False, sort=False) return_indexers=return_indexers, sort=sort, ) - - if return_indexers: - result, lidx, ridx = result - return self._apply_meta(result), lidx, ridx - return self._apply_meta(result) + return result # ------------------------------------------------------------------------ # Set Operation Methods @@ -719,13 +716,6 @@ def _union(self, other, sort): # ------------------------------------------------------------------------ - def _apply_meta(self, rawarr) -> "PeriodIndex": - if not isinstance(rawarr, PeriodIndex): - if not isinstance(rawarr, PeriodArray): - rawarr = PeriodArray(rawarr, freq=self.freq) - rawarr = PeriodIndex._simple_new(rawarr, name=self.name) - return rawarr - def memory_usage(self, deep=False): result = super().memory_usage(deep=deep) if hasattr(self, "_cache") and "_int64index" in self._cache: