{"record":{"id":"72a66fc7ae644dab","repo":"mlflow/mlflow","slug":"failed-to-convert-column-name-from-type-values","errorCode":null,"errorMessage":"Failed to convert column {name} from type {values.dtype} to {t}.","messagePattern":"Failed to convert column (.+?) from type (.+?) to (.+?)\\.","errorType":"error_code","errorClass":"MlflowException","httpStatus":null,"severity":"error","filePath":"mlflow/models/utils.py","lineNumber":808,"sourceCode":"    if t == DataType.datetime and values.dtype.kind == t.to_numpy().kind:\n        # NB: datetime values have variable precision denoted by brackets, e.g. datetime64[ns]\n        # denotes nanosecond precision. Since MLflow datetime type is precision agnostic, we\n        # ignore precision when matching datetime columns.\n        try:\n            return values.astype(np.dtype(\"datetime64[ns]\"))\n        except TypeError as e:\n            raise MlflowException(\n                \"Please ensure that the input data of datetime column only contains timezone-naive \"\n                f\"datetime objects. Error: {e}\"\n            )\n\n    if t == DataType.datetime and (values.dtype == object or values.dtype == t.to_python()):\n        # NB: Pyspark date columns get converted to object when converted to a pandas\n        # DataFrame. To respect the original typing, we convert the column to datetime.\n        try:\n            return values.astype(np.dtype(\"datetime64[ns]\"), errors=\"raise\")\n        except ValueError as e:\n            raise MlflowException(\n                f\"Failed to convert column {name} from type {values.dtype} to {t}.\"\n            ) from e\n\n    if t == DataType.boolean and values.dtype == object:\n        # Should not convert type otherwise it converts None to boolean False\n        return values\n\n    if t == DataType.double and values.dtype == decimal.Decimal:\n        # NB: Pyspark Decimal column get converted to decimal.Decimal when converted to pandas\n        # DataFrame. In order to support decimal data training from spark data frame, we add this\n        # conversion even we might lose the precision.\n        try:\n            return pd.to_numeric(values, errors=\"raise\")\n        except ValueError:\n            raise MlflowException(\n                f\"Failed to convert column {name} from type {values.dtype} to {t}.\"\n            )\n","sourceCodeStart":790,"sourceCodeEnd":826,"githubUrl":"https://github.com/mlflow/mlflow/blob/6a27f2decc0b76eb1b54af31849784addb357dbc/mlflow/models/utils.py#L790-L826","documentation":"For object-dtype or python-datetime columns expected to be datetime, MLflow attempts values.astype(datetime64[ns], errors='raise'). If any element cannot be parsed into a datetime (e.g. malformed strings, mixed types), ValueError is raised and wrapped in this exception naming the column and both types. This is the column-level conversion path for PySpark date columns converted to object dtype.","triggerScenarios":"Column declared datetime in the signature but data contains unparsable strings like 'not-a-date', mixed str/datetime objects, or None mixed into an object column being converted.","commonSituations":"Pyspark DataFrames converted to pandas where date columns become object dtype; CSV reads leaving mixed-type date columns; user input forms sending free-text dates.","solutions":["Pre-convert the column with pd.to_datetime(df[name], errors='coerce') and inspect/handle rows that became NaT","Fix or drop rows with invalid date values before calling predict","Parse strings with an explicit format: pd.to_datetime(df[name], format='%Y-%m-%d')","If the column genuinely isn't datetime, correct the model signature or the incoming data type"],"exampleFix":"# before\ndf[\"date\"] = df[\"date\"].astype(str)  # mixed/unparsable strings\nmodel.predict(df)\n\n// after\ndf[\"date\"] = pd.to_datetime(df[\"date\"], format=\"%Y-%m-%d\", errors=\"coerce\")\ndf = df.dropna(subset=[\"date\"])\nmodel.predict(df)","handlingStrategy":"validation","validationCode":"import pandas as pd\nfor col, t in schema.column_types().items():\n    if str(t).endswith(\"datetime\"):\n        bad = pd.to_datetime(df[col], errors=\"coerce\").isna() & df[col].notna()\n        assert not bad.any(), f\"unparsable datetime values in {col}: {df.loc[bad, col].head().tolist()}\"","typeGuard":"def is_parsable_datetime(v) -> bool:\n    return isinstance(v, (datetime.datetime, datetime.date, str)) and bool(str(v).strip()) and pd.notna(pd.to_datetime(v, errors=\"coerce\"))","tryCatchPattern":"try:\n    preds = model.predict(df)\nexcept MlflowException as e:\n    if \"Failed to convert column\" in str(e):\n        col = str(e).split(\"column \")[1].split(\" \")[0]\n        df[col] = pd.to_datetime(df[col], errors=\"coerce\")\n        preds = model.predict(df.dropna(subset=[col]))\n    else:\n        raise","preventionTips":["Convert date columns with pd.to_datetime(..., errors='coerce') right after loading data","Log and drop rows with invalid dates before scoring","Keep date columns as datetime from source instead of strings","Test your serving path with the model's saved input_example"],"tags":["mlflow","pandas","datetime","conversion"],"backgroundTag":"column-datetime-conversion-failed","analyzedSha":"6a27f2decc0b76eb1b54af31849784addb357dbc","analyzedAt":"2026-08-29T20:54:51.419Z","schemaVersion":2},"datasetVersion":"2026-08-29T22:17:34.462Z"}