diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index b2629e606f8f5..8f00d9077598d 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -1,6 +1,6 @@ from __future__ import annotations -from datetime import datetime, timedelta +from datetime import date, datetime, time, timedelta import operator from typing import ( TYPE_CHECKING, @@ -552,6 +552,11 @@ def _validate_scalar( ------- self._scalar_type or NaT """ + + if type(value) == date: + # GH35830 + value = datetime.combine(value, time.min) + if isinstance(value, str): # NB: Careful about tzawareness try: diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 0df954e054826..3253baed8e847 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -646,6 +646,10 @@ def get_loc(self, key, method=None, tolerance=None): if is_valid_nat_for_dtype(key, self.dtype): key = NaT + if type(key) == date: + # GH35830 + key = datetime.combine(key, time.min) + if isinstance(key, self._data._recognized_scalars): # needed to localize naive datetimes self._deprecate_mismatched_indexing(key) diff --git a/pandas/tests/indexing/test_loc.py b/pandas/tests/indexing/test_loc.py index aec5e3adfe111..bc97645f6e531 100644 --- a/pandas/tests/indexing/test_loc.py +++ b/pandas/tests/indexing/test_loc.py @@ -1,5 +1,5 @@ """ test label based indexing with loc """ -from datetime import datetime, time, timedelta +from datetime import date, datetime, time, timedelta from io import StringIO import re @@ -2130,3 +2130,13 @@ def test_loc_iloc_setitem_with_listlike(self, size, array_fn): ser = Series(0, index=list("abcde"), dtype=object) ser.iloc[0] = arr tm.assert_series_equal(ser, expected) + + def test_loc_getitem_date_objs_with_datetimeindex(self): + # GH35830 + dates = [date(2000, 1, i) for i in (1, 2, 5)] + values = [1, 2, 3] + s = Series(values, dates) + i = 1 + expected = values[i] + result = s.loc[dates[i]] + assert result == expected