diff --git a/pandas/core/arrays/_utils.py b/pandas/core/arrays/_utils.py index 6b46396d5efdf..4957fb0fa2069 100644 --- a/pandas/core/arrays/_utils.py +++ b/pandas/core/arrays/_utils.py @@ -15,49 +15,51 @@ if TYPE_CHECKING: from pandas._typing import ( - ArrayLike, npt, ) + from pandas.core.arrays.base import ExtensionArray + def to_numpy_dtype_inference( - arr: ArrayLike, dtype: npt.DTypeLike | None, na_value, hasna: bool -) -> tuple[npt.DTypeLike, Any]: + arr: ExtensionArray, dtype: npt.DTypeLike | None, na_value, hasna: bool +) -> tuple[np.dtype | None, Any]: + result_dtype: np.dtype | None + inferred_numeric_dtype = False if dtype is None and is_numeric_dtype(arr.dtype): - dtype_given = False + inferred_numeric_dtype = True if hasna: if arr.dtype.kind == "b": - dtype = np.dtype(np.object_) + result_dtype = np.dtype(np.object_) else: if arr.dtype.kind in "iu": - dtype = np.dtype(np.float64) + result_dtype = np.dtype(np.float64) else: - dtype = arr.dtype.numpy_dtype # type: ignore[union-attr] + result_dtype = arr.dtype.numpy_dtype # type: ignore[attr-defined] if na_value is lib.no_default: na_value = np.nan else: - dtype = arr.dtype.numpy_dtype # type: ignore[union-attr] + result_dtype = arr.dtype.numpy_dtype # type: ignore[attr-defined] elif dtype is not None: - dtype = np.dtype(dtype) - dtype_given = True + result_dtype = np.dtype(dtype) else: - dtype_given = True + result_dtype = None if na_value is lib.no_default: - if dtype is None or not hasna: + if result_dtype is None or not hasna: na_value = arr.dtype.na_value - elif dtype.kind == "f": # type: ignore[union-attr] + elif result_dtype.kind == "f": na_value = np.nan - elif dtype.kind == "M": # type: ignore[union-attr] + elif result_dtype.kind == "M": na_value = np.datetime64("nat") - elif dtype.kind == "m": # type: ignore[union-attr] + elif result_dtype.kind == "m": na_value = np.timedelta64("nat") else: na_value = arr.dtype.na_value - if not dtype_given and hasna: + if inferred_numeric_dtype and hasna: try: - np_can_hold_element(dtype, na_value) # type: ignore[arg-type] + np_can_hold_element(result_dtype, na_value) # type: ignore[arg-type] except LossySetitemError: - dtype = np.dtype(np.object_) - return dtype, na_value + result_dtype = np.dtype(np.object_) + return result_dtype, na_value