diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index 916d4f9f2fd28..ff835eb32f6df 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -399,7 +399,9 @@ def __init__( # sanitize_array coerces np.nan to a string under certain versions # of numpy values = maybe_infer_to_datetimelike(values) - if not isinstance(values, (np.ndarray, ExtensionArray)): + if isinstance(values, np.ndarray): + values = sanitize_to_nanoseconds(values) + elif not isinstance(values, ExtensionArray): values = com.convert_to_list_like(values) # By convention, empty lists result in object dtype: @@ -409,9 +411,6 @@ def __init__( values = [values[idx] for idx in np.where(~null_mask)[0]] values = sanitize_array(values, None, dtype=sanitize_dtype) - else: - values = sanitize_to_nanoseconds(values) - if dtype.categories is None: try: codes, categories = factorize(values, sort=True) diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index 669bfe08d42b0..00cc1aeab336f 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -1432,7 +1432,7 @@ def maybe_infer_to_datetimelike( if not len(v): return value - def try_datetime(v): + def try_datetime(v: np.ndarray) -> ArrayLike: # safe coerce to datetime64 try: # GH19671 @@ -1451,14 +1451,15 @@ def try_datetime(v): except (ValueError, TypeError): pass else: - return DatetimeIndex(values).tz_localize("UTC").tz_convert(tz=tz) + dti = DatetimeIndex(values).tz_localize("UTC").tz_convert(tz=tz) + return dti._data except TypeError: # e.g. is not convertible to datetime pass return v.reshape(shape) - def try_timedelta(v): + def try_timedelta(v: np.ndarray) -> np.ndarray: # safe coerce to timedelta64 # will try first with a string & object conversion diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 2d6cfff561aab..5b06059d4302c 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4000,7 +4000,7 @@ def assign(self, **kwargs) -> DataFrame: data[k] = com.apply_if_callable(v, data) return data - def _sanitize_column(self, value): + def _sanitize_column(self, value) -> ArrayLike: """ Ensures new columns (which go into the BlockManager as new blocks) are always copied and converted into an array. @@ -4011,7 +4011,7 @@ def _sanitize_column(self, value): Returns ------- - numpy.ndarray + numpy.ndarray or ExtensionArray """ self._ensure_valid_index(value) @@ -4025,7 +4025,7 @@ def _sanitize_column(self, value): value = value.copy() value = sanitize_index(value, self.index) - elif isinstance(value, Index) or is_sequence(value): + elif is_sequence(value): # turn me into an ndarray value = sanitize_index(value, self.index) @@ -4035,7 +4035,7 @@ def _sanitize_column(self, value): else: value = com.asarray_tuplesafe(value) elif isinstance(value, Index): - value = value.copy(deep=True) + value = value.copy(deep=True)._values else: value = value.copy()