{"record":{"id":"52fc959e254ad5e6","repo":"pandas-dev/pandas","slug":"cannot-interpolate-with-self-dtype-dtype-52fc95","errorCode":null,"errorMessage":"Cannot interpolate with {self.dtype} dtype","messagePattern":"Cannot interpolate with (.+?) dtype","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/numpy_.py","lineNumber":398,"sourceCode":"\n    def interpolate(\n        self,\n        *,\n        method: InterpolateOptions,\n        axis: int,\n        index: Index,\n        limit,\n        limit_direction,\n        limit_area,\n        copy: bool,\n        **kwargs,\n    ) -> Self:\n        \"\"\"\n        See NDFrame.interpolate.__doc__.\n        \"\"\"\n        # NB: we return type(self) even if copy=False\n        if not self.dtype._is_numeric:\n            raise TypeError(f\"Cannot interpolate with {self.dtype} dtype\")\n\n        if not copy:\n            out_data = self._ndarray\n        else:\n            out_data = self._ndarray.copy()\n\n        # TODO: assert we have floating dtype?\n        missing.interpolate_2d_inplace(\n            out_data,\n            method=method,\n            axis=axis,\n            index=index,\n            limit=limit,\n            limit_direction=limit_direction,\n            limit_area=limit_area,\n            **kwargs,\n        )\n        if not copy:","sourceCodeStart":380,"sourceCodeEnd":416,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/arrays/numpy_.py#L380-L416","documentation":"Raised by NumpyExtensionArray.interpolate when self.dtype._is_numeric is False. Interpolation requires numeric ordering (linear, time, index methods all need arithmetic on the values), so non-numeric NumpyExtensionArrays (object, string, bytes, datetime-with-object-fallback) are rejected. The dtype name is interpolated into the message.","triggerScenarios":"series = pd.Series(['1', '2', None, '4'], dtype=object); series.interpolate() — object dtype. A string-dtype Series with NaNs calling interpolate. A NumpyExtensionArray of datetime64 stored as object.","commonSituations":"Data loaded as strings/object that should be numeric; calling df.interpolate() on a mixed-type DataFrame where some columns are object; forgetting pd.to_numeric before interpolation.","solutions":["Convert to numeric first: series = pd.to_numeric(series, errors='coerce').interpolate().","Drop or forward-fill non-numeric columns instead of interpolating: series.ffill().","Select only numeric columns before interpolate: df.select_dtypes('number').interpolate()."],"exampleFix":"# before\ns = pd.Series(['1', '2', None, '4'], dtype=object)\ns.interpolate()  # raises\n\n# after\npd.to_numeric(s, errors='coerce').interpolate()","handlingStrategy":"validation","validationCode":"import pandas as pd\n\ndef interpolate_numeric(series):\n    if series.dtype == object or series.dtype.kind in 'OUS':\n        series = pd.to_numeric(series, errors='coerce')\n    return series.interpolate()","typeGuard":"def is_numeric_series(series) -> bool:\n    return series.dtype.kind in 'iufcb'","tryCatchPattern":"try:\n    s.interpolate()\nexcept TypeError as e:\n    if 'Cannot interpolate' in str(e):\n        pd.to_numeric(s, errors='coerce').interpolate()\n    else:\n        raise","preventionTips":["Run pd.to_numeric(errors='coerce') on object columns before interpolate().","Use df.select_dtypes('number').interpolate() to skip non-numeric columns.","For categorical/string data, use ffill()/bfill() rather than interpolate()."],"tags":["pandas","numpy-extension-array","interpolate","numeric","dtype"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}