Skip to content

Commit 7f49b53

Browse files
committed
PERF: PeriodEngine.get_loc accept narrow data type (#29234)
1 parent 9a68635 commit 7f49b53

File tree

3 files changed

+9
-15
lines changed

3 files changed

+9
-15
lines changed

doc/source/whatsnew/v1.1.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Deprecations
4040
Performance improvements
4141
~~~~~~~~~~~~~~~~~~~~~~~~
4242

43-
-
43+
- Performance improvement in :meth:`PeriodIndex.get_loc` using input from user (:issue:`29038`)
4444
-
4545

4646
.. ---------------------------------------------------------------------------

pandas/core/indexes/period.py

+7-13
Original file line numberDiff line numberDiff line change
@@ -598,11 +598,9 @@ def get_loc(self, key, method=None, tolerance=None):
598598
TypeError
599599
If key is listlike or otherwise not hashable.
600600
"""
601-
602601
if isinstance(key, str):
603602
try:
604-
asdt, parsed, reso = parse_time_string(key, self.freq)
605-
key = asdt
603+
key, parsed, reso = parse_time_string(key, self.freq)
606604
except DateParseError:
607605
# A string with invalid format
608606
raise KeyError(f"Cannot interpret '{key}' as period")
@@ -613,25 +611,21 @@ def get_loc(self, key, method=None, tolerance=None):
613611

614612
try:
615613
key = Period(key, freq=self.freq)
614+
ordinal = key.ordinal if key is not NaT else key.value
616615
except ValueError:
617616
# we cannot construct the Period
618617
# as we have an invalid type
619618
if is_list_like(key):
620619
raise TypeError(f"'{key}' is an invalid key")
621620
raise KeyError(key)
622621

623-
ordinal = key.ordinal if key is not NaT else key.value
622+
if tolerance is not None:
623+
tolerance = self._convert_tolerance(tolerance, np.asarray(key))
624+
624625
try:
625-
return self._engine.get_loc(ordinal)
626+
return self._int64index.get_loc(ordinal, method, tolerance)
626627
except KeyError:
627-
628-
try:
629-
if tolerance is not None:
630-
tolerance = self._convert_tolerance(tolerance, np.asarray(key))
631-
return self._int64index.get_loc(ordinal, method, tolerance)
632-
633-
except KeyError:
634-
raise KeyError(key)
628+
raise KeyError(key)
635629

636630
def _maybe_cast_slice_bound(self, label, side, kind):
637631
"""

pandas/tests/indexes/common.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ def test_memory_usage(self, indices):
340340
# RangeIndex, IntervalIndex
341341
# don't have engines
342342
if not isinstance(indices, (RangeIndex, IntervalIndex)):
343-
assert result2 > result
343+
assert result2 >= result
344344

345345
if indices.inferred_type == "object":
346346
assert result3 > result2

0 commit comments

Comments
 (0)