@@ -863,30 +863,12 @@ def value_counts_internal(
863863 dropna : bool = True ,
864864) -> Series :
865865 from pandas import (
866+ DatetimeIndex ,
866867 Index ,
867868 Series ,
869+ TimedeltaIndex ,
868870 )
869871
870- def _preserve_freq (original_values , result_index ):
871- freq = getattr (original_values , "freq" , None )
872-
873- if (
874- freq is not None
875- and type (original_values ) is type (result_index )
876- and len (result_index ) == len (original_values )
877- and result_index .equals (original_values )
878- ):
879- try :
880- # Rebuild index with freq using the same constructor
881- return type (result_index )(
882- result_index ._data , freq = freq , name = result_index .name
883- )
884- except (TypeError , ValueError ):
885- # If reconstruction fails, return original index
886- pass
887-
888- return result_index
889-
890872 index_name = getattr (values , "name" , None )
891873 name = "proportion" if normalize else "count"
892874
@@ -953,10 +935,26 @@ def _preserve_freq(original_values, result_index):
953935 if (
954936 bins is None
955937 and not sort
956- and hasattr (values , "freq" )
957- and values .freq is not None
938+ and isinstance (values , ( DatetimeIndex , TimedeltaIndex ) )
939+ and values .inferred_freq is not None
958940 ):
959- idx = _preserve_freq (values , idx )
941+ # freq preservation
942+ # Check if the result would be the same as input
943+ if len (idx ) == len (values ) and idx .equals (values ):
944+ # Rebuild idx with the correct type and inferred frequency
945+ if isinstance (values , DatetimeIndex ):
946+ idx = DatetimeIndex (
947+ idx ._data if hasattr (idx , "_data" ) else idx .values ,
948+ freq = values .inferred_freq ,
949+ name = idx .name ,
950+ )
951+
952+ elif isinstance (values , TimedeltaIndex ):
953+ idx = TimedeltaIndex (
954+ idx ._data if hasattr (idx , "_data" ) else idx .values ,
955+ freq = values .inferred_freq ,
956+ name = idx .name ,
957+ )
960958
961959 result = Series (counts , index = idx , name = name , copy = False )
962960
0 commit comments