1616from pandas .errors import InvalidIndexError
1717from pandas .util ._decorators import cache_readonly
1818
19+ from pandas .core .dtypes .cast import sanitize_to_nanoseconds
1920from pandas .core .dtypes .common import (
2021 is_categorical_dtype ,
21- is_datetime64_dtype ,
2222 is_list_like ,
2323 is_scalar ,
24- is_timedelta64_dtype ,
2524)
2625
2726import pandas .core .algorithms as algorithms
@@ -466,9 +465,6 @@ def __init__(
466465 if isinstance (grouper , (Series , Index )) and name is None :
467466 self .name = grouper .name
468467
469- if isinstance (grouper , MultiIndex ):
470- self .grouper = grouper ._values
471-
472468 # we have a single grouper which may be a myriad of things,
473469 # some of which are dependent on the passing in level
474470
@@ -506,14 +502,9 @@ def __init__(
506502 self .grouper = grouper ._get_grouper ()
507503
508504 else :
509- if self .grouper is None and self .name is not None and self .obj is not None :
510- self .grouper = self .obj [self .name ]
511-
512- elif isinstance (self .grouper , (list , tuple )):
513- self .grouper = com .asarray_tuplesafe (self .grouper )
514505
515506 # a passed Categorical
516- elif is_categorical_dtype (self .grouper ):
507+ if is_categorical_dtype (self .grouper ):
517508
518509 self .grouper , self .all_grouper = recode_for_groupby (
519510 self .grouper , self .sort , observed
@@ -539,7 +530,7 @@ def __init__(
539530 )
540531
541532 # we are done
542- if isinstance (self .grouper , Grouping ):
533+ elif isinstance (self .grouper , Grouping ):
543534 self .grouper = self .grouper .grouper
544535
545536 # no level passed
@@ -562,14 +553,10 @@ def __init__(
562553 self .grouper = None # Try for sanity
563554 raise AssertionError (errmsg )
564555
565- # if we have a date/time-like grouper, make sure that we have
566- # Timestamps like
567- if getattr (self .grouper , "dtype" , None ) is not None :
568- if is_datetime64_dtype (self .grouper ):
569- self .grouper = self .grouper .astype ("datetime64[ns]" )
570- elif is_timedelta64_dtype (self .grouper ):
571-
572- self .grouper = self .grouper .astype ("timedelta64[ns]" )
556+ if isinstance (self .grouper , np .ndarray ):
557+ # if we have a date/time-like grouper, make sure that we have
558+ # Timestamps like
559+ self .grouper = sanitize_to_nanoseconds (self .grouper )
573560
574561 def __repr__ (self ) -> str :
575562 return f"Grouping({ self .name } )"
@@ -876,9 +863,14 @@ def _convert_grouper(axis: Index, grouper):
876863 return grouper ._values
877864 else :
878865 return grouper .reindex (axis )._values
879- elif isinstance (grouper , (list , Series , Index , np .ndarray )):
866+ elif isinstance (grouper , MultiIndex ):
867+ return grouper ._values
868+ elif isinstance (grouper , (list , tuple , Series , Index , np .ndarray )):
880869 if len (grouper ) != len (axis ):
881870 raise ValueError ("Grouper and axis must be same length" )
871+
872+ if isinstance (grouper , (list , tuple )):
873+ grouper = com .asarray_tuplesafe (grouper )
882874 return grouper
883875 else :
884876 return grouper
0 commit comments