diff --git a/pandas/core/construction.py b/pandas/core/construction.py index 640c8d66807ad..8aa3d7900e8e9 100644 --- a/pandas/core/construction.py +++ b/pandas/core/construction.py @@ -588,9 +588,13 @@ def _try_cast(arr, dtype: Optional[DtypeObj], copy: bool, raise_cast_failure: bo Otherwise an object array is returned. """ # perf shortcut as this is the most common case - if isinstance(arr, np.ndarray): - if maybe_castable(arr) and not copy and dtype is None: - return arr + if ( + isinstance(arr, np.ndarray) + and maybe_castable(arr.dtype) + and not copy + and dtype is None + ): + return arr if isinstance(dtype, ExtensionDtype) and (dtype.kind != "M" or is_sparse(dtype)): # create an extension array from its dtype diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index 1cb592f18dd2c..ed36beb80986e 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -1331,20 +1331,18 @@ def convert_dtypes( return inferred_dtype -def maybe_castable(arr: np.ndarray) -> bool: +def maybe_castable(dtype: np.dtype) -> bool: # return False to force a non-fastpath - assert isinstance(arr, np.ndarray) # GH 37024 - # check datetime64[ns]/timedelta64[ns] are valid # otherwise try to coerce - kind = arr.dtype.kind + kind = dtype.kind if kind == "M": - return is_datetime64_ns_dtype(arr.dtype) + return is_datetime64_ns_dtype(dtype) elif kind == "m": - return is_timedelta64_ns_dtype(arr.dtype) + return is_timedelta64_ns_dtype(dtype) - return arr.dtype.name not in POSSIBLY_CAST_DTYPES + return dtype.name not in POSSIBLY_CAST_DTYPES def maybe_infer_to_datetimelike(