@@ -2596,10 +2596,15 @@ def _maybe_drop_levels(indexer, levels, drop_level):
2596
2596
if not drop_level :
2597
2597
return self [indexer ]
2598
2598
# kludgearound
2599
- new_index = self [indexer ]
2599
+ orig_index = new_index = self [indexer ]
2600
2600
levels = [self ._get_level_number (i ) for i in levels ]
2601
2601
for i in sorted (levels , reverse = True ):
2602
- new_index = new_index .droplevel (i )
2602
+ try :
2603
+ new_index = new_index .droplevel (i )
2604
+ except :
2605
+
2606
+ # no dropping here
2607
+ return orig_index
2603
2608
return new_index
2604
2609
2605
2610
if isinstance (level , (tuple , list )):
@@ -2635,20 +2640,37 @@ def _maybe_drop_levels(indexer, levels, drop_level):
2635
2640
pass
2636
2641
2637
2642
if not any (isinstance (k , slice ) for k in key ):
2638
- if len (key ) == self .nlevels :
2639
- if self .is_unique :
2640
- return self ._engine .get_loc (_values_from_object (key )), None
2641
- else :
2642
- indexer = slice (* self .slice_locs (key , key ))
2643
- return indexer , self [indexer ]
2644
- else :
2645
- # partial selection
2643
+
2644
+ # partial selection
2645
+ def partial_selection (key ):
2646
2646
indexer = slice (* self .slice_locs (key , key ))
2647
2647
if indexer .start == indexer .stop :
2648
2648
raise KeyError (key )
2649
2649
ilevels = [i for i in range (len (key ))
2650
2650
if key [i ] != slice (None , None )]
2651
2651
return indexer , _maybe_drop_levels (indexer , ilevels , drop_level )
2652
+
2653
+ if len (key ) == self .nlevels :
2654
+
2655
+ if self .is_unique :
2656
+
2657
+ # here we have a completely specified key, but are using some partial string matching here
2658
+ # GH4758
2659
+ can_index_exactly = any ([ l .is_all_dates and not isinstance (k ,compat .string_types ) for k , l in zip (key , self .levels ) ])
2660
+ if any ([ l .is_all_dates for k , l in zip (key , self .levels ) ]) and not can_index_exactly :
2661
+ indexer = slice (* self .slice_locs (key , key ))
2662
+
2663
+ # we have a multiple selection here
2664
+ if not indexer .stop - indexer .start == 1 :
2665
+ return partial_selection (key )
2666
+
2667
+ key = tuple (self [indexer ].tolist ()[0 ])
2668
+
2669
+ return self ._engine .get_loc (_values_from_object (key )), None
2670
+ else :
2671
+ return partial_selection (key )
2672
+ else :
2673
+ return partial_selection (key )
2652
2674
else :
2653
2675
indexer = None
2654
2676
for i , k in enumerate (key ):
0 commit comments