diff --git a/pandas/core/groupby/grouper.py b/pandas/core/groupby/grouper.py index e8af9da30a298..73227bb6ec159 100644 --- a/pandas/core/groupby/grouper.py +++ b/pandas/core/groupby/grouper.py @@ -374,7 +374,10 @@ def _set_grouper(self, obj: FrameOrSeries, sort: bool = False): # possibly sort if (self.sort or sort) and not ax.is_monotonic: # use stable sort to support first, last, nth - indexer = self.indexer = ax.argsort(kind="mergesort") + # TODO: why does putting na_position="first" fix datetimelike cases? + indexer = self.indexer = ax.array.argsort( + kind="mergesort", na_position="first" + ) ax = ax.take(indexer) obj = obj.take(indexer, axis=self.axis) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 40fcc824992b7..5c5fd40b39ade 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -4776,10 +4776,6 @@ def argsort(self, *args, **kwargs) -> np.ndarray: >>> idx[order] Index(['a', 'b', 'c', 'd'], dtype='object') """ - if needs_i8_conversion(self.dtype): - # TODO: these do not match the underlying EA argsort methods GH#37863 - return self.asi8.argsort(*args, **kwargs) - # This works for either ndarray or EA, is overriden # by RangeIndex, MultIIndex return self._data.argsort(*args, **kwargs) diff --git a/pandas/tests/indexes/datetimelike.py b/pandas/tests/indexes/datetimelike.py index 14f9c2f9de284..c128f4ab6b7dd 100644 --- a/pandas/tests/indexes/datetimelike.py +++ b/pandas/tests/indexes/datetimelike.py @@ -10,6 +10,14 @@ class DatetimeLike(Base): + def test_argsort_matches_array(self): + rng = self.create_index() + rng = rng.insert(1, pd.NaT) + + result = rng.argsort() + expected = rng._data.argsort() + tm.assert_numpy_array_equal(result, expected) + def test_can_hold_identifiers(self): idx = self.create_index() key = idx[0]