@@ -647,32 +647,24 @@ def get_value(self, series, key):
647
647
locs = self .indexer_at_time (key )
648
648
return series .take (locs )
649
649
650
- try :
651
- value = Index .get_value (self , series , key )
652
- except KeyError :
650
+ if isinstance (key , str ):
653
651
try :
654
652
loc = self ._get_string_slice (key )
655
653
return series [loc ]
656
654
except (TypeError , ValueError , KeyError ):
657
655
pass
658
-
659
656
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 ):
662
661
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 )
665
665
666
666
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 )
676
668
values = self ._engine .get_value (com .values_from_object (series ), key , tz = self .tz )
677
669
return com .maybe_box (self , values , series , key )
678
670
@@ -684,20 +676,31 @@ def get_loc(self, key, method=None, tolerance=None):
684
676
-------
685
677
loc : int
686
678
"""
679
+ if is_scalar (key ) and isna (key ):
680
+ key = NaT # FIXME: do this systematically
687
681
688
682
if tolerance is not None :
689
683
# try converting tolerance now, so errors don't get swallowed by
690
684
# the try/except clauses below
691
685
tolerance = self ._convert_tolerance (tolerance , np .asarray (key ))
692
686
693
- if isinstance (key , datetime ):
687
+ if isinstance (key , ( datetime , np . datetime64 ) ):
694
688
# 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 )
699
690
return Index .get_loc (self , key , method , tolerance )
700
691
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
+
701
704
elif isinstance (key , timedelta ):
702
705
# GH#20464
703
706
raise TypeError (
@@ -711,28 +714,16 @@ def get_loc(self, key, method=None, tolerance=None):
711
714
)
712
715
return self .indexer_at_time (key )
713
716
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 )
721
718
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
736
727
737
728
def _maybe_cast_slice_bound (self , label , side , kind ):
738
729
"""
0 commit comments