{"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/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/datetimelike.py#L1074-L1110","documentation":"Raised by _sub_datetimelike_scalar when a datelike scalar (datetime/np.datetime64) is subtracted from an array whose dtype.kind is not 'M' (i.e., not a DatetimeArray). Subtracting a date from a TimedeltaArray or PeriodArray is not well-defined, so pandas raises TypeError rather than returning garbage.","triggerScenarios":"TimedeltaIndex - datetime, or PeriodIndex - datetime, dispatched through __sub__ line 1388 into _sub_datetimelike_scalar at line 1088; the guard at line 1091 fires.","commonSituations":"Subtracting the wrong operand order (datetime - timedelta is valid; timedelta - datetime is not), or assuming Period arithmetic accepts datetime.","solutions":["Flip the operand order: pd.Timestamp('2020-01-01') - timedelta_idx yields a DatetimeIndex.","If both operands are timestamps, ensure the left side is the DatetimeArray: use ts - td, not td - ts.","For Period arrays, convert to timestamp first via idx.to_timestamp() if a datetime subtraction is intended.","Inspect self.dtype.kind: only 'M' (datetime) supports subtracting a datelike scalar."],"exampleFix":"// before\nout = timedelta_idx - pd.Timestamp('2020-01-01')  # TypeError\n// after\nout = pd.Timestamp('2020-01-01') - timedelta_idx","handlingStrategy":"type-guard","validationCode":"if idx.dtype.kind != 'M':\n    # subtracting a datetime scalar is invalid; flip the order\n    out = pd.Timestamp('2020-01-01') - idx\nelse:\n    out = idx - pd.Timestamp('2020-01-01')","typeGuard":"def accepts_datelike_subtraction(idx) -> bool:\n    return getattr(idx.dtype, 'kind', None) == 'M'","tryCatchPattern":"try:\n    out = idx - ts\nexcept TypeError as e:\n    if 'cannot subtract a datelike' in str(e):\n        out = ts - idx\n    else:\n        raise","preventionTips":["Remember datetime - timedelta is valid; timedelta - datetime is not.","Check left.dtype.kind == 'M' before subtracting a datelike scalar.","Convert Period to timestamp if datetime subtraction is needed."],"tags":["subtraction","datetime","operand-order","timedelta"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}