Skip to content

Commit 9b0ef5d

Browse files
jbrockmendeljreback
authored andcommitted
refactor DTI.get_loc (#31023)
1 parent d243ca0 commit 9b0ef5d

File tree

1 file changed

+34
-43
lines changed

1 file changed

+34
-43
lines changed

pandas/core/indexes/datetimes.py

+34-43
Original file line numberDiff line numberDiff line change
@@ -647,32 +647,24 @@ def get_value(self, series, key):
647647
locs = self.indexer_at_time(key)
648648
return series.take(locs)
649649

650-
try:
651-
value = Index.get_value(self, series, key)
652-
except KeyError:
650+
if isinstance(key, str):
653651
try:
654652
loc = self._get_string_slice(key)
655653
return series[loc]
656654
except (TypeError, ValueError, KeyError):
657655
pass
658-
659656
try:
660-
return self.get_value_maybe_box(series, key)
661-
except (TypeError, ValueError, KeyError):
657+
stamp = self._maybe_cast_for_get_loc(key)
658+
loc = self.get_loc(stamp)
659+
return series[loc]
660+
except (KeyError, ValueError):
662661
raise KeyError(key)
663-
else:
664-
return com.maybe_box(self, value, series, key)
662+
663+
value = Index.get_value(self, series, key)
664+
return com.maybe_box(self, value, series, key)
665665

666666
def get_value_maybe_box(self, series, key):
667-
# needed to localize naive datetimes
668-
if self.tz is not None:
669-
key = Timestamp(key)
670-
if key.tzinfo is not None:
671-
key = key.tz_convert(self.tz)
672-
else:
673-
key = key.tz_localize(self.tz)
674-
elif not isinstance(key, Timestamp):
675-
key = Timestamp(key)
667+
key = self._maybe_cast_for_get_loc(key)
676668
values = self._engine.get_value(com.values_from_object(series), key, tz=self.tz)
677669
return com.maybe_box(self, values, series, key)
678670

@@ -684,20 +676,31 @@ def get_loc(self, key, method=None, tolerance=None):
684676
-------
685677
loc : int
686678
"""
679+
if is_scalar(key) and isna(key):
680+
key = NaT # FIXME: do this systematically
687681

688682
if tolerance is not None:
689683
# try converting tolerance now, so errors don't get swallowed by
690684
# the try/except clauses below
691685
tolerance = self._convert_tolerance(tolerance, np.asarray(key))
692686

693-
if isinstance(key, datetime):
687+
if isinstance(key, (datetime, np.datetime64)):
694688
# needed to localize naive datetimes
695-
if key.tzinfo is None:
696-
key = Timestamp(key, tz=self.tz)
697-
else:
698-
key = Timestamp(key).tz_convert(self.tz)
689+
key = self._maybe_cast_for_get_loc(key)
699690
return Index.get_loc(self, key, method, tolerance)
700691

692+
elif isinstance(key, str):
693+
try:
694+
return self._get_string_slice(key)
695+
except (TypeError, KeyError, ValueError, OverflowError):
696+
pass
697+
698+
try:
699+
stamp = self._maybe_cast_for_get_loc(key)
700+
return Index.get_loc(self, stamp, method, tolerance)
701+
except (KeyError, ValueError):
702+
raise KeyError(key)
703+
701704
elif isinstance(key, timedelta):
702705
# GH#20464
703706
raise TypeError(
@@ -711,28 +714,16 @@ def get_loc(self, key, method=None, tolerance=None):
711714
)
712715
return self.indexer_at_time(key)
713716

714-
try:
715-
return Index.get_loc(self, key, method, tolerance)
716-
except (KeyError, ValueError, TypeError):
717-
try:
718-
return self._get_string_slice(key)
719-
except (TypeError, KeyError, ValueError, OverflowError):
720-
pass
717+
return Index.get_loc(self, key, method, tolerance)
721718

722-
try:
723-
stamp = Timestamp(key)
724-
if stamp.tzinfo is not None and self.tz is not None:
725-
stamp = stamp.tz_convert(self.tz)
726-
else:
727-
stamp = stamp.tz_localize(self.tz)
728-
return Index.get_loc(self, stamp, method, tolerance)
729-
except KeyError:
730-
raise KeyError(key)
731-
except ValueError as e:
732-
# list-like tolerance size must match target index size
733-
if "list-like" in str(e):
734-
raise e
735-
raise KeyError(key)
719+
def _maybe_cast_for_get_loc(self, key):
720+
# needed to localize naive datetimes
721+
key = Timestamp(key)
722+
if key.tzinfo is None:
723+
key = key.tz_localize(self.tz)
724+
else:
725+
key = key.tz_convert(self.tz)
726+
return key
736727

737728
def _maybe_cast_slice_bound(self, label, side, kind):
738729
"""

0 commit comments

Comments
 (0)