@@ -287,18 +287,25 @@ def factorize(values, sort=False, order=None, na_sentinel=-1, size_hint=None):
287
287
"""
288
288
from pandas import Index , Series , DatetimeIndex , PeriodIndex
289
289
290
- if is_datetimetz (values ):
291
- values = DatetimeIndex (values )
292
-
293
- if is_period_dtype (values ):
294
- values = PeriodIndex (values )
295
- # period array interface goes to object so intercept
296
- vals = values .view (np .int64 )
290
+ # handling two possibilities here
291
+ # - for a numpy datetimelike simply view as i8 then cast back
292
+ # - for an extension datetimelike view as i8 then
293
+ # reconstruct from boxed values to transfer metadata
294
+ dtype = None
295
+ if needs_i8_conversion (values ):
296
+ if is_period_dtype (values ):
297
+ values = PeriodIndex (values )
298
+ vals = values .asi8
299
+ elif is_datetimetz (values ):
300
+ values = DatetimeIndex (values )
301
+ vals = values .asi8
302
+ else :
303
+ # numpy dtype
304
+ dtype = values .dtype
305
+ vals = values .view (np .int64 )
297
306
else :
298
307
vals = np .asarray (values )
299
308
300
- is_datetime = is_datetime64_dtype (vals )
301
- is_timedelta = is_timedelta64_dtype (vals )
302
309
(hash_klass , vec_klass ), vals = _get_data_algo (vals , _hashtables )
303
310
304
311
table = hash_klass (size_hint or len (vals ))
@@ -313,10 +320,9 @@ def factorize(values, sort=False, order=None, na_sentinel=-1, size_hint=None):
313
320
uniques , labels = safe_sort (uniques , labels , na_sentinel = na_sentinel ,
314
321
assume_unique = True )
315
322
316
- if is_datetime :
317
- uniques = uniques .astype ('M8[ns]' )
318
- elif is_timedelta :
319
- uniques = uniques .astype ('m8[ns]' )
323
+ if dtype is not None :
324
+ uniques = uniques .astype (dtype )
325
+
320
326
if isinstance (values , Index ):
321
327
uniques = values ._shallow_copy (uniques , name = None )
322
328
elif isinstance (values , Series ):
0 commit comments