Skip to content

Commit be8b482

Browse files
Backport PR #47547 on branch 1.4.x (REGR: NotImplementedError: Prefix not defined when slicing offset with loc) (#48209)
Backport PR #47547: REGR: NotImplementedError: Prefix not defined when slicing offset with loc Co-authored-by: Tobias Pitters <[email protected]>
1 parent 5c91a0e commit be8b482

File tree

3 files changed

+50
-1
lines changed

3 files changed

+50
-1
lines changed

doc/source/whatsnew/v1.4.4.rst

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Fixed regressions
2222
- Fixed regression in :meth:`DataFrame.loc` not updating the cache correctly after values were set (:issue:`47867`)
2323
- Fixed regression in :meth:`DataFrame.loc` not aligning index in some cases when setting a :class:`DataFrame` (:issue:`47578`)
2424
- Fixed regression in :meth:`DataFrame.loc` setting a length-1 array like value to a single value in the DataFrame (:issue:`46268`)
25+
- Fixed regression when slicing with :meth:`DataFrame.loc` with :class:`DateOffset`-index (:issue:`46671`)
2526
- Fixed regression in setting ``None`` or non-string value into a ``string``-dtype Series using a mask (:issue:`47628`)
2627
- Fixed regression using custom Index subclasses (for example, used in xarray) with :meth:`~DataFrame.reset_index` or :meth:`Index.insert` (:issue:`47071`)
2728
- Fixed regression in :meth:`DatetimeIndex.intersection` when the :class:`DatetimeIndex` has dates crossing daylight savings time (:issue:`46702`)

pandas/core/indexes/datetimelike.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,12 @@ def _parsed_string_to_bounds(self, reso: Resolution, parsed):
228228

229229
def _parse_with_reso(self, label: str):
230230
# overridden by TimedeltaIndex
231-
parsed, reso_str = parsing.parse_time_string(label, self.freq)
231+
try:
232+
if self.freq is None or hasattr(self.freq, "rule_code"):
233+
freq = self.freq
234+
except NotImplementedError:
235+
freq = getattr(self, "freqstr", getattr(self, "inferred_freq", None))
236+
parsed, reso_str = parsing.parse_time_string(label, freq)
232237
reso = Resolution.from_attrname(reso_str)
233238
return parsed, reso
234239

pandas/tests/frame/indexing/test_getitem.py

+43
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88
CategoricalDtype,
99
CategoricalIndex,
1010
DataFrame,
11+
DateOffset,
1112
DatetimeIndex,
1213
Index,
1314
MultiIndex,
1415
Series,
1516
Timestamp,
1617
concat,
18+
date_range,
1719
get_dummies,
1820
period_range,
1921
)
@@ -165,6 +167,47 @@ def test_getitem_iloc_two_dimensional_generator(self):
165167
expected = Series([5, 6], name="b", index=[1, 2])
166168
tm.assert_series_equal(result, expected)
167169

170+
def test_getitem_iloc_dateoffset_days(self):
171+
# GH 46671
172+
df = DataFrame(
173+
list(range(10)),
174+
index=date_range("01-01-2022", periods=10, freq=DateOffset(days=1)),
175+
)
176+
result = df.loc["2022-01-01":"2022-01-03"]
177+
expected = DataFrame(
178+
[0, 1, 2],
179+
index=DatetimeIndex(
180+
["2022-01-01", "2022-01-02", "2022-01-03"],
181+
dtype="datetime64[ns]",
182+
freq=DateOffset(days=1),
183+
),
184+
)
185+
tm.assert_frame_equal(result, expected)
186+
187+
df = DataFrame(
188+
list(range(10)),
189+
index=date_range(
190+
"01-01-2022", periods=10, freq=DateOffset(days=1, hours=2)
191+
),
192+
)
193+
result = df.loc["2022-01-01":"2022-01-03"]
194+
expected = DataFrame(
195+
[0, 1, 2],
196+
index=DatetimeIndex(
197+
["2022-01-01 00:00:00", "2022-01-02 02:00:00", "2022-01-03 04:00:00"],
198+
dtype="datetime64[ns]",
199+
freq=DateOffset(days=1, hours=2),
200+
),
201+
)
202+
tm.assert_frame_equal(result, expected)
203+
204+
df = DataFrame(
205+
list(range(10)),
206+
index=date_range("01-01-2022", periods=10, freq=DateOffset(minutes=3)),
207+
)
208+
result = df.loc["2022-01-01":"2022-01-03"]
209+
tm.assert_frame_equal(result, df)
210+
168211

169212
class TestGetitemCallable:
170213
def test_getitem_callable(self, float_frame):

0 commit comments

Comments
 (0)