Skip to content

Commit ddef9d9

Browse files
committed
REGR: Fixed slicing DatetimeIndex with date
Closes pandas-dev#31501
1 parent ba08390 commit ddef9d9

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

doc/source/whatsnew/v1.0.1.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Interval
6868
Indexing
6969
^^^^^^^^
7070

71-
-
71+
- Fixed regression when indexing a ``Series`` or ``DataFrame`` indexed by ``DatetimeIndex`` with a slice containg a :class:`datetime.date` (:issue:`31501`)
7272
-
7373

7474
Missing

pandas/core/indexes/datetimes.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import datetime, time, timedelta, tzinfo
1+
from datetime import date, datetime, time, timedelta, tzinfo
22
import operator
33
from typing import Optional
44
import warnings
@@ -758,6 +758,13 @@ def slice_indexer(self, start=None, end=None, step=None, kind=None):
758758
if isinstance(start, time) or isinstance(end, time):
759759
raise KeyError("Cannot mix time and non-time slice keys")
760760

761+
# Pandas supports slicing with dates, treated as datetimes at midnight.
762+
# https://github.com/pandas-dev/pandas/issues/31501
763+
if isinstance(start, date):
764+
start = datetime.combine(start, time(0, 0))
765+
if isinstance(end, date):
766+
end = datetime.combine(end, time(0, 0))
767+
761768
try:
762769
return Index.slice_indexer(self, start, end, step, kind=kind)
763770
except KeyError:

pandas/tests/indexing/test_datetime.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import datetime, timedelta
1+
from datetime import date, datetime, timedelta
22

33
from dateutil import tz
44
import numpy as np
@@ -350,3 +350,23 @@ def test_loc_label_slicing(self):
350350
expected = ser.iloc[:-1]
351351

352352
tm.assert_series_equal(result, expected)
353+
354+
@pytest.mark.parametrize(
355+
"slice_, positions",
356+
[
357+
[slice(date(2018, 1, 1), None), [0, 1, 2]],
358+
[slice(date(2019, 1, 2), None), [2]],
359+
[slice(date(2020, 1, 1), None), []],
360+
[slice(None, date(2020, 1, 1)), [0, 1, 2]],
361+
[slice(None, date(2019, 1, 1)), [0]],
362+
],
363+
)
364+
def test_getitem_slice_date(self, slice_, positions):
365+
# https://github.com/pandas-dev/pandas/issues/31501
366+
s = pd.Series(
367+
[0, 1, 2],
368+
pd.DatetimeIndex(["2019-01-01", "2019-01-01T06:00:00", "2019-01-02"]),
369+
)
370+
result = s[slice_]
371+
expected = s.take(positions)
372+
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)