Skip to content

Commit 2a20e05

Browse files
TomAugspurgerjorisvandenbossche
authored andcommitted
REGR: Fixed slicing DatetimeIndex with date (pandas-dev#31521)
1 parent 78b7079 commit 2a20e05

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

doc/source/whatsnew/v1.0.1.rst

+3
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ Interval
7777
Indexing
7878
^^^^^^^^
7979

80+
81+
- Fixed regression when indexing a ``Series`` or ``DataFrame`` indexed by ``DatetimeIndex`` with a slice containg a :class:`datetime.date` (:issue:`31501`)
82+
- Fixed regression in :class:`DataFrame` setting values with a slice (e.g. ``df[-4:] = 1``) indexing by label instead of position (:issue:`31469`)
8083
-
8184
-
8285
- Bug where assigning to a :class:`Series` using a IntegerArray / BooleanArray as a mask would raise ``TypeError`` (:issue:`31446`)

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
@@ -804,6 +804,13 @@ def slice_indexer(self, start=None, end=None, step=None, kind=None):
804804
if isinstance(start, time) or isinstance(end, time):
805805
raise KeyError("Cannot mix time and non-time slice keys")
806806

807+
# Pandas supports slicing with dates, treated as datetimes at midnight.
808+
# https://github.com/pandas-dev/pandas/issues/31501
809+
if isinstance(start, date) and not isinstance(start, datetime):
810+
start = datetime.combine(start, time(0, 0))
811+
if isinstance(end, date) and not isinstance(end, datetime):
812+
end = datetime.combine(end, time(0, 0))
813+
807814
try:
808815
return Index.slice_indexer(self, start, end, step, kind=kind)
809816
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)