From 2f503a8dc3fa04d24d7add7b08916ff00760b9eb Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 24 Jan 2021 18:45:13 +0000 Subject: [PATCH 1/2] BUG: GH35830 Restore index by Date to DatetimeIndex DatetimeIndex has supported indexing by date for many many years. This was broken after 1.0.5. This attempts to restore support by promoting date a non--tz aware datetime at midnight. --- pandas/core/arrays/datetimelike.py | 7 ++++++- pandas/core/indexes/datetimes.py | 4 ++++ pandas/tests/indexing/test_loc.py | 12 +++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index be9864731842d..2598cb722a046 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, @@ -543,6 +543,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 8329c41a74596..1de3653a395b1 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -649,6 +649,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 68f12a939e061..18cb4104a1c2a 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 @@ -2090,3 +2090,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, pd.DatetimeIndex(dates)) + i = 1 + expected = values[i] + result = s.loc[dates[i]] + assert result == expected From 670e868d6ea5f17dd6e1ca1a77dabdebe52bccf7 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 24 Jan 2021 20:49:05 +0000 Subject: [PATCH 2/2] fixing inconsistent-namespace-usage --- pandas/tests/indexing/test_loc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/indexing/test_loc.py b/pandas/tests/indexing/test_loc.py index 18cb4104a1c2a..55355f615b2fe 100644 --- a/pandas/tests/indexing/test_loc.py +++ b/pandas/tests/indexing/test_loc.py @@ -2095,7 +2095,7 @@ 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, pd.DatetimeIndex(dates)) + s = Series(values, dates) i = 1 expected = values[i] result = s.loc[dates[i]]