diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index 43c3a5e8bfd4c..f192a34514390 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -53,10 +53,10 @@ ) from pandas.core.dtypes.dtypes import IntervalDtype from pandas.core.dtypes.generic import ( + ABCDataFrame, ABCDatetimeIndex, ABCIntervalIndex, ABCPeriodIndex, - ABCSeries, ) from pandas.core.dtypes.missing import ( is_valid_na_for_dtype, @@ -206,10 +206,7 @@ def __new__( verify_integrity: bool = True, ): - if isinstance(data, (ABCSeries, ABCIntervalIndex)) and is_interval_dtype( - data.dtype - ): - data = data._values # TODO: extract_array? + data = extract_array(data, extract_numpy=True) if isinstance(data, cls): left = data._left @@ -1616,7 +1613,15 @@ def _maybe_convert_platform_interval(values) -> ArrayLike: # empty lists/tuples get object dtype by default, but this is # prohibited for IntervalArray, so coerce to integer instead return np.array([], dtype=np.int64) + elif not is_list_like(values) or isinstance(values, ABCDataFrame): + # This will raise later, but we avoid passing to maybe_convert_platform + return values elif is_categorical_dtype(values): values = np.asarray(values) + elif not hasattr(values, "dtype") and not isinstance(values, (list, tuple, range)): + # TODO: should we just cast these to list? + return values + else: + values = extract_array(values, extract_numpy=True) return maybe_convert_platform(values) diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index f5ec6616659ba..b6fffdea7ae96 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -119,16 +119,21 @@ _int64_max = np.iinfo(np.int64).max -def maybe_convert_platform(values): +def maybe_convert_platform( + values: Union[list, tuple, range, np.ndarray, ExtensionArray] +) -> ArrayLike: """ try to do platform conversion, allow ndarray or list here """ if isinstance(values, (list, tuple, range)): - values = construct_1d_object_array_from_listlike(values) - if getattr(values, "dtype", None) == np.object_: - if hasattr(values, "_values"): - values = values._values - values = lib.maybe_convert_objects(values) + arr = construct_1d_object_array_from_listlike(values) + else: + # The caller is responsible for ensuring that we have np.ndarray + # or ExtensionArray here. + arr = values - return values + if arr.dtype == object: + arr = lib.maybe_convert_objects(arr) + + return arr def is_nested_object(obj) -> bool: diff --git a/pandas/core/internals/construction.py b/pandas/core/internals/construction.py index 7eade970253bf..d9b525b91272a 100644 --- a/pandas/core/internals/construction.py +++ b/pandas/core/internals/construction.py @@ -400,7 +400,15 @@ def _prep_ndarray(values, copy: bool = True) -> np.ndarray: return arr[..., np.newaxis] def convert(v): - return maybe_convert_platform(v) + if not is_list_like(v) or isinstance(v, ABCDataFrame): + return v + elif not hasattr(v, "dtype") and not isinstance(v, (list, tuple, range)): + # TODO: should we cast these to list? + return v + + v = extract_array(v, extract_numpy=True) + res = maybe_convert_platform(v) + return res # we could have a 1-dim or 2-dim list here # this is equiv of np.asarray, but does object conversion