diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 59ac122e4f9ea..0426949c9e1a5 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -39,7 +39,6 @@ no_default, ) from pandas._libs.tslibs import ( - OutOfBoundsDatetime, Timestamp, tz_compare, ) @@ -6204,11 +6203,6 @@ def _maybe_downcast_for_indexing(self, other: Index) -> tuple[Index, Index]: # standardize on UTC return self.tz_convert("UTC"), other.tz_convert("UTC") - elif self.inferred_type == "date" and isinstance(other, ABCDatetimeIndex): - try: - return type(other)(self), other - except OutOfBoundsDatetime: - return self, other elif self.inferred_type == "timedelta" and isinstance(other, ABCTimedeltaIndex): # TODO: we dont have tests that get here return type(other)(self), other diff --git a/pandas/tests/frame/indexing/test_indexing.py b/pandas/tests/frame/indexing/test_indexing.py index 0c99b08cb30c4..b89904b632c33 100644 --- a/pandas/tests/frame/indexing/test_indexing.py +++ b/pandas/tests/frame/indexing/test_indexing.py @@ -1880,6 +1880,19 @@ def test_add_new_column_infer_string(): tm.assert_frame_equal(df, expected) +def test_datetime_indexer_consistency_pyarrow_date32(): + # GH#62158 + ser = Series(["2016-01-01"], dtype="date32[pyarrow]") + ser3 = ser.astype("datetime64[ns]") + dti = Index(ser3) + # All should be consistent + assert dti.get_loc(ser[0]) == 0 + tm.assert_numpy_array_equal(dti.get_indexer(ser.values), np.array([0])) + tm.assert_numpy_array_equal( + dti.get_indexer(ser.values.astype(object)), np.array([0]) + ) + + class TestSetitemValidation: # This is adapted from pandas/tests/arrays/masked/test_indexing.py def _check_setitem_invalid(self, df, invalid, indexer): diff --git a/pandas/tests/frame/methods/test_asfreq.py b/pandas/tests/frame/methods/test_asfreq.py index 1c3c41e2e0299..727011ece9dc7 100644 --- a/pandas/tests/frame/methods/test_asfreq.py +++ b/pandas/tests/frame/methods/test_asfreq.py @@ -192,9 +192,10 @@ def test_asfreq_with_date_object_index(self, frame_or_series): ts2 = ts.copy() ts2.index = [x.date() for x in ts2.index] - result = ts2.asfreq("4h", method="ffill") - expected = ts.asfreq("4h", method="ffill") - tm.assert_equal(result, expected) + with pytest.raises( + TypeError, match="Cannot compare Timestamp with datetime.date" + ): + ts2.asfreq("4h", method="ffill") def test_asfreq_with_unsorted_index(self, frame_or_series): # GH#39805 diff --git a/pandas/tests/indexes/datetimes/test_indexing.py b/pandas/tests/indexes/datetimes/test_indexing.py index c44345273466c..7c1c7d5ed4816 100644 --- a/pandas/tests/indexes/datetimes/test_indexing.py +++ b/pandas/tests/indexes/datetimes/test_indexing.py @@ -517,7 +517,7 @@ def test_get_indexer_date_objs(self): rng = date_range("1/1/2000", periods=20) result = rng.get_indexer(rng.map(lambda x: x.date())) - expected = rng.get_indexer(rng) + expected = np.full(len(rng), -1, dtype=np.intp) tm.assert_numpy_array_equal(result, expected) def test_get_indexer(self): @@ -562,17 +562,22 @@ def test_get_indexer(self): idx.get_indexer(idx[[0]], method="nearest", tolerance="foo") @pytest.mark.parametrize( - "target", + "target, expected", [ - [date(2020, 1, 1), Timestamp("2020-01-02")], - [Timestamp("2020-01-01"), date(2020, 1, 2)], + ( + [date(2020, 1, 1), Timestamp("2020-01-02")], + np.array([-1, 1], dtype=np.intp), + ), + ( + [Timestamp("2020-01-01"), Timestamp(date(2020, 1, 2))], + np.array([0, 1], dtype=np.intp), + ), ], ) - def test_get_indexer_mixed_dtypes(self, target): + def test_get_indexer_mixed_dtypes(self, target, expected): # https://github.com/pandas-dev/pandas/issues/33741 values = DatetimeIndex([Timestamp("2020-01-01"), Timestamp("2020-01-02")]) result = values.get_indexer(target) - expected = np.array([0, 1], dtype=np.intp) tm.assert_numpy_array_equal(result, expected) @pytest.mark.parametrize( diff --git a/pandas/tests/reshape/merge/test_merge.py b/pandas/tests/reshape/merge/test_merge.py index a8e29ef03acc2..416805e8bfa72 100644 --- a/pandas/tests/reshape/merge/test_merge.py +++ b/pandas/tests/reshape/merge/test_merge.py @@ -2132,9 +2132,9 @@ def test_dtype_on_categorical_dates(self): expected_outer = DataFrame( [ - [pd.Timestamp("2001-01-01").date(), 1.1, 1.3], - [pd.Timestamp("2001-01-02").date(), 1.3, np.nan], - [pd.Timestamp("2001-01-03").date(), np.nan, 1.4], + [date(2001, 1, 1), 1.1, 1.3], + [date(2001, 1, 2), 1.3, np.nan], + [date(2001, 1, 3), np.nan, 1.4], ], columns=["date", "num2", "num4"], ) @@ -2142,7 +2142,7 @@ def test_dtype_on_categorical_dates(self): tm.assert_frame_equal(result_outer, expected_outer) expected_inner = DataFrame( - [[pd.Timestamp("2001-01-01").date(), 1.1, 1.3]], + [[date(2001, 1, 1), 1.1, 1.3]], columns=["date", "num2", "num4"], ) result_inner = merge(df, df2, how="inner", on=["date"]) diff --git a/pandas/tests/series/test_arithmetic.py b/pandas/tests/series/test_arithmetic.py index 35a9742d653db..5c560b9981f85 100644 --- a/pandas/tests/series/test_arithmetic.py +++ b/pandas/tests/series/test_arithmetic.py @@ -763,7 +763,8 @@ def test_align_date_objects_with_datetimeindex(self): ts_slice = ts[5:] ts2 = ts_slice.copy() - ts2.index = [x.date() for x in ts2.index] + # Explicitly convert date objects to Timestamps for alignment + ts2.index = [pd.Timestamp(x.date()) for x in ts2.index] result = ts + ts2 result2 = ts2 + ts