diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 0e70b3795bc85..57759af23ddd5 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -137,15 +137,17 @@ def to_pyarrow_type( Convert dtype to a pyarrow type instance. """ if isinstance(dtype, ArrowDtype): - pa_dtype = dtype.pyarrow_dtype + return dtype.pyarrow_dtype elif isinstance(dtype, pa.DataType): - pa_dtype = dtype + return dtype elif dtype: - # Accepts python types too - pa_dtype = pa.from_numpy_dtype(dtype) - else: - pa_dtype = None - return pa_dtype + try: + # Accepts python types too + # Doesn't handle all numpy types + return pa.from_numpy_dtype(dtype) + except pa.ArrowNotImplementedError: + pass + return None class ArrowExtensionArray(OpsMixin, ExtensionArray): diff --git a/pandas/tests/frame/methods/test_convert_dtypes.py b/pandas/tests/frame/methods/test_convert_dtypes.py index aaccaff0c0c42..919d25f5ba993 100644 --- a/pandas/tests/frame/methods/test_convert_dtypes.py +++ b/pandas/tests/frame/methods/test_convert_dtypes.py @@ -120,3 +120,11 @@ def test_pyarrow_dtype_backend_from_pandas_nullable(self): } ) tm.assert_frame_equal(result, expected) + + def test_pyarrow_dtype_empty_object(self): + # GH 50970 + pytest.importorskip("pyarrow") + expected = pd.DataFrame(columns=[0]) + with pd.option_context("mode.dtype_backend", "pyarrow"): + result = expected.convert_dtypes() + tm.assert_frame_equal(result, expected)