{"record":{"id":"bf001520f8f349d9","repo":"pandas-dev/pandas","slug":"cannot-subtract-a-datelike-from-a-type-self-na","errorCode":null,"errorMessage":"cannot subtract a datelike from a {type(self).__name__}","messagePattern":"cannot subtract a datelike from a (.+?)","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/datetimelike.py","lineNumber":1092,"sourceCode":"        res_values = result.view(f\"M8[{self.unit}]\")\n        return DatetimeArray._simple_new(res_values, dtype=dtype)\n\n    @final\n    def _add_datetime_arraylike(self, other: DatetimeArray) -> DatetimeArray:\n        if not lib.is_np_dtype(self.dtype, \"m\"):\n            raise TypeError(\n                f\"cannot add {type(self).__name__} and {type(other).__name__}\"\n            )\n\n        # defer to DatetimeArray.__add__\n        return other + self\n\n    @final\n    def _sub_datetimelike_scalar(\n        self, other: datetime | np.datetime64\n    ) -> TimedeltaArray:\n        if self.dtype.kind != \"M\":\n            raise TypeError(f\"cannot subtract a datelike from a {type(self).__name__}\")\n\n        self = cast(\"DatetimeArray\", self)\n        # subtract a datetime from myself, yielding an ndarray[timedelta64[ns]]\n\n        if isna(other):\n            # i.e. np.datetime64(\"NaT\")\n            return self - NaT\n\n        ts = Timestamp(other)\n\n        self, ts = self._ensure_matching_resos(ts)\n        return self._sub_datetimelike(ts)\n\n    @final\n    def _sub_datetime_arraylike(self, other: DatetimeArray) -> TimedeltaArray:\n        if self.dtype.kind != \"M\":\n            raise TypeError(f\"cannot subtract a datelike from a {type(self).__name__}\")\n","sourceCodeStart":1074,"sourceCodeEnd":1110,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/arrays/datetimelike.py#L1074-L1110","documentation":"Raised by _sub_datetimelike_scalar when self.dtype.kind != 'M'. Subtracting a datetime scalar (datetime / np.datetime64) is only defined for DatetimeArray (point - point -> TimedeltaArray); subtracting a datetime from a TimedeltaArray or PeriodArray is meaningless and rejected.","triggerScenarios":"TimedeltaArray - Timestamp(...); PeriodArray - datetime.datetime(...); any non-datetime datetimelike array minus a datelike scalar.","commonSituations":"Confusing a duration column with a date column when computing elapsed time; Period-indexed data being differenced against an absolute date.","solutions":["Ensure the left operand is a DatetimeArray (dtype kind 'M') before subtracting a datetime scalar.","If working with TimedeltaArray, subtract a Timedelta scalar instead.","Convert Periods to timestamps with .to_timestamp() if you need point-in-time subtraction."],"exampleFix":"// before\nres = tda - pd.Timestamp('2020-01-01')  # TypeError\n\n// after\nres = dta - pd.Timestamp('2020-01-01')  # use a DatetimeArray","handlingStrategy":"type-guard","validationCode":"import pandas as pd\n\ndef sub_datetime_scalar(arr, other):\n    if arr.dtype.kind != 'M':\n        raise TypeError('left operand must be a DatetimeArray to subtract a datetime scalar')\n    return arr - other","typeGuard":"import pandas as pd\n\ndef is_datetime_array(a) -> bool:\n    return getattr(a, 'dtype', None) is not None and a.dtype.kind == 'M'","tryCatchPattern":"try:\n    res = arr - other\nexcept TypeError as e:\n    if 'cannot subtract a datelike' in str(e):\n        # convert other to a Timedelta if the array is a TimedeltaArray\n        res = arr - pd.Timedelta(other)\n    else:\n        raise","preventionTips":["Only subtract datetime scalars from DatetimeArray; for TimedeltaArray subtract Timedeltas.","Convert Period arrays via .to_timestamp() before mixing with datetime scalars.","Type-check operand dtypes before subtraction helpers."],"tags":["datetime","arithmetic","type-error","subtraction"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}