{"record":{"id":"93233f43a5f5dec8","repo":"pandas-dev/pandas","slug":"converting-strings-to-pa-type-is-not-implemented","errorCode":null,"errorMessage":"Converting strings to {pa_type} is not implemented.","messagePattern":"Converting strings to (.+?) is not implemented\\.","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/arrow/array.py","lineNumber":496,"sourceCode":"            scalars = pc.if_else(pc.equal(scalars, \"0.0\"), \"0\", scalars)\n            scalars = scalars.cast(pa.bool_())\n        elif (\n            pa.types.is_integer(pa_type)\n            or pa.types.is_floating(pa_type)\n            or pa.types.is_decimal(pa_type)\n        ):\n            from pandas.core.tools.numeric import to_numeric\n\n            scalars = to_numeric(strings, errors=\"raise\")\n            if is_pa_array:\n                scalars = strings.cast(pa_type)\n            else:\n                mask = isna(strings)\n                if mask is not None:\n                    scalars = pa.array(scalars, mask=mask, type=pa_type)\n\n        else:\n            raise NotImplementedError(\n                f\"Converting strings to {pa_type} is not implemented.\"\n            )\n        return cls._from_sequence(scalars, dtype=pa_type, copy=copy)\n\n    def _from_pyarrow_array(self, pa_array):\n        \"\"\"\n        Construct from a pyarrow Array/ChunkedArray result of an operation.\n\n        Avoids full __init__ overhead by reusing the dtype when the pyarrow\n        type is unchanged.\n        \"\"\"\n        assert isinstance(pa_array, (pa.Array, pa.ChunkedArray))\n        obj = type(self).__new__(type(self))\n        if isinstance(pa_array, pa.Array):\n            pa_array = pa.chunked_array([pa_array])\n        obj._pa_array = pa_array\n        pa_type = pa_array.type\n        obj._dtype = (","sourceCodeStart":478,"sourceCodeEnd":514,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/arrow/array.py#L478-L514","documentation":"Raised by _from_sequence_of_strings when the target pa_type is not one of the string-convertible types handled (string/binary/timestamp/date/duration/time/bool/int/float/decimal). This path is used when constructing an ArrowExtensionArray from a sequence of strings with a given ArrowDtype. Any pyarrow type outside the enumerated set (e.g. list_, struct, fixed_size_binary, month_day_nano_interval, large_binary variants not special-cased) raises NotImplementedError.","triggerScenarios":"Building a pyarrow-backed array from strings into an unsupported dtype: `pd.array(['1','2'], dtype=ArrowDtype(pa.list_(pa.int64())))`, or `_from_sequence_of_strings(strings, dtype=ArrowDtype(pa.struct([...])))`, or interval/temporal-with-timezone types not yet handled.","commonSituations":"Parsing CSV/string columns into complex Arrow types (lists, structs) expecting automatic inference; using pd.Series([...strings...], dtype=ArrowDtype(some_complex_type)); upgrading pandas/pyarrow and hitting a newly-added pa_type not yet supported by the string-conversion ladder.","solutions":["Pre-convert the strings to a pyarrow array yourself and pass values, not strings: pa.array(parsed_lists, type=pa.list_(pa.int64())).","Use a supported intermediate dtype first (e.g. object) then cast.","Switch to a non-pyarrow dtype for the conversion step and convert_dtypes() afterwards.","For list/struct types, build the pa.Array from already-typed Python objects via _from_sequence."],"exampleFix":"# before\nimport pyarrow as pa\nimport pandas as pd\narr = pd.array(['[1,2]','[3]'], dtype=pd.ArrowDtype(pa.list_(pa.int64())))  # NotImplementedError\n# after - parse first, then build\nparsed = [[1,2],[3]]\narr = pd.array(parsed, dtype=pd.ArrowDtype(pa.list_(pa.int64())))","handlingStrategy":"validation","validationCode":"import pyarrow as pa\n\nSUPPORTED_FOR_STR_CONV = (\n    pa.types.is_string, pa.types.is_large_string, pa.types.is_binary,\n    pa.types.is_timestamp, pa.types.is_date, pa.types.is_duration,\n    pa.types.is_time, pa.types.is_boolean, pa.types.is_integer,\n    pa.types.is_floating, pa.types.is_decimal,\n)\n\ndef can_convert_strings(pa_type) -> bool:\n    return any(check(pa_type) for check in SUPPORTED_FOR_STR_CONV)\n\n# before: pd.array(strings, dtype=pd.ArrowDtype(pa_type))\nif not can_convert_strings(pa_type):\n    parsed = pre_parse(strings, pa_type)  # your parser\n    arr = pd.array(parsed, dtype=pd.ArrowDtype(pa_type))\nelse:\n    arr = pd.array(strings, dtype=pd.ArrowDtype(pa_type))","typeGuard":"import pyarrow as pa\n\ndef is_string_convertible_arrow_type(t) -> bool:\n    checks = (\n        pa.types.is_string, pa.types.is_large_string, pa.types.is_binary,\n        pa.types.is_timestamp, pa.types.is_date, pa.types.is_duration,\n        pa.types.is_time, pa.types.is_boolean, pa.types.is_integer,\n        pa.types.is_floating, pa.types.is_decimal,\n    )\n    return any(c(t) for c in checks)","tryCatchPattern":"try:\n    arr = pd.array(strings, dtype=pd.ArrowDtype(pa_type))\nexcept NotImplementedError as e:\n    if 'Converting strings to' in str(e):\n        parsed = pre_parse(strings, pa_type)\n        arr = pd.array(parsed, dtype=pd.ArrowDtype(pa_type))\n    else:\n        raise","preventionTips":["Pre-parse complex types (list/struct) into Python objects before pd.array.","Test string->dtype conversion for any new ArrowDtype at the boundary.","Keep a whitelist of supported pa_types for string ingestion."],"tags":["pyarrow","dtype-conversion","string-parsing","not-implemented"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}