1212
1313from pandas .core .dtypes .common import (
1414 is_bool_dtype , is_datetime64_any_dtype , is_float , is_float_dtype ,
15- is_integer , is_integer_dtype , pandas_dtype )
15+ is_integer , is_integer_dtype , pandas_dtype , is_categorical ,
16+ ensure_platform_int )
1617
1718from pandas .core import common as com
1819from pandas .core .accessor import delegate_names
@@ -600,7 +601,8 @@ def get_value(self, series, key):
600601 return series [key ]
601602 elif grp == freqn :
602603 key = Period (asdt , freq = self .freq ).ordinal
603- return com .maybe_box (self , self ._engine .get_value (s , key ),
604+ return com .maybe_box (self ,
605+ self ._int64index .get_value (s , key ),
604606 series , key )
605607 else :
606608 raise KeyError (key )
@@ -609,7 +611,7 @@ def get_value(self, series, key):
609611
610612 period = Period (key , self .freq )
611613 key = period .value if isna (period ) else period .ordinal
612- return com .maybe_box (self , self ._engine .get_value (s , key ),
614+ return com .maybe_box (self , self ._int64index .get_value (s , key ),
613615 series , key )
614616
615617 @Appender (_index_shared_docs ['get_indexer' ] % _index_doc_kwargs )
@@ -630,6 +632,21 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
630632 return Index .get_indexer (self ._int64index , target , method ,
631633 limit , tolerance )
632634
635+ @Appender (_index_shared_docs ['get_indexer_non_unique' ] % _index_doc_kwargs )
636+ def get_indexer_non_unique (self , target ):
637+ target = ensure_index (target )
638+
639+ if isinstance (target , PeriodIndex ):
640+ target = target .asi8
641+ if hasattr (target , 'freq' ) and target .freq != self .freq :
642+ msg = DIFFERENT_FREQ .format (cls = type (self ).__name__ ,
643+ own_freq = self .freqstr ,
644+ other_freq = target .freqstr )
645+ raise IncompatibleFrequency (msg )
646+
647+ indexer , missing = self ._int64index .get_indexer_non_unique (target )
648+ return ensure_platform_int (indexer ), missing
649+
633650 def _get_unique_index (self , dropna = False ):
634651 """
635652 wrap Index._get_unique_index to handle NaT
@@ -906,6 +923,10 @@ def base(self):
906923 FutureWarning , stacklevel = 2 )
907924 return np .asarray (self ._data )
908925
926+ def memory_usage (self , deep = False ):
927+ result = super (PeriodIndex , self ).memory_usage (deep = deep )
928+ result += self ._int64index .memory_usage (deep = deep )
929+ return result
909930
910931PeriodIndex ._add_comparison_ops ()
911932PeriodIndex ._add_numeric_methods_disabled ()
0 commit comments