Skip to content

Commit 2495068

Browse files
REGR: Fixed slicing DatetimeIndex with date (#31521)
1 parent 22f0d84 commit 2495068

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

doc/source/whatsnew/v1.0.1.rst

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ Interval
6767

6868
Indexing
6969
^^^^^^^^
70+
71+
- Fixed regression when indexing a ``Series`` or ``DataFrame`` indexed by ``DatetimeIndex`` with a slice containg a :class:`datetime.date` (:issue:`31501`)
7072
- Fixed regression in :class:`DataFrame` setting values with a slice (e.g. ``df[-4:] = 1``) indexing by label instead of position (:issue:`31469`)
7173
-
7274
-

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) and not isinstance(start, datetime):
764+
start = datetime.combine(start, time(0, 0))
765+
if isinstance(end, date) and not isinstance(end, datetime):
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)