@@ -2596,10 +2596,15 @@ def _maybe_drop_levels(indexer, levels, drop_level):
25962596 if not drop_level :
25972597 return self [indexer ]
25982598 # kludgearound
2599- new_index = self [indexer ]
2599+ orig_index = new_index = self [indexer ]
26002600 levels = [self ._get_level_number (i ) for i in levels ]
26012601 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
26032608 return new_index
26042609
26052610 if isinstance (level , (tuple , list )):
@@ -2635,20 +2640,37 @@ def _maybe_drop_levels(indexer, levels, drop_level):
26352640 pass
26362641
26372642 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 ):
26462646 indexer = slice (* self .slice_locs (key , key ))
26472647 if indexer .start == indexer .stop :
26482648 raise KeyError (key )
26492649 ilevels = [i for i in range (len (key ))
26502650 if key [i ] != slice (None , None )]
26512651 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 )
26522674 else :
26532675 indexer = None
26542676 for i , k in enumerate (key ):
0 commit comments