diff --git a/pandas-stubs/_libs/tslibs/offsets.pyi b/pandas-stubs/_libs/tslibs/offsets.pyi index 1acdadf78..4b6a61230 100644 --- a/pandas-stubs/_libs/tslibs/offsets.pyi +++ b/pandas-stubs/_libs/tslibs/offsets.pyi @@ -14,6 +14,7 @@ from typing import ( from dateutil.relativedelta import weekday as WeekdayClass import numpy as np +from pandas import Timestamp from pandas.core.indexes.datetimes import DatetimeIndex from typing_extensions import Self @@ -22,7 +23,7 @@ from pandas._typing import npt from pandas.tseries.holiday import AbstractHolidayCalendar -_DatetimeT = TypeVar("_DatetimeT", bound=date) +_DatetimeT = TypeVar("_DatetimeT", bound=datetime) _TimedeltaT = TypeVar("_TimedeltaT", bound=timedelta) prefix_mapping: dict[str, type] @@ -42,26 +43,32 @@ class BaseOffset: @overload def __add__(self, other: npt.NDArray[np.object_]) -> npt.NDArray[np.object_]: ... @overload - def __add__(self, other: BaseOffset) -> Self: ... + def __add__(self, other: _DatetimeT) -> _DatetimeT: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload] + @overload + def __add__(self, other: date) -> Timestamp: ... @overload - def __add__(self, other: _DatetimeT) -> _DatetimeT: ... + def __add__(self, other: BaseOffset) -> Self: ... @overload def __add__(self, other: _TimedeltaT) -> _TimedeltaT: ... @overload def __radd__(self, other: npt.NDArray[np.object_]) -> npt.NDArray[np.object_]: ... @overload - def __radd__(self, other: BaseOffset) -> Self: ... + def __radd__(self, other: _DatetimeT) -> _DatetimeT: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload] @overload - def __radd__(self, other: _DatetimeT) -> _DatetimeT: ... + def __radd__(self, other: date) -> Timestamp: ... + @overload + def __radd__(self, other: BaseOffset) -> Self: ... @overload def __radd__(self, other: _TimedeltaT) -> _TimedeltaT: ... def __sub__(self, other: BaseOffset) -> Self: ... @overload def __rsub__(self, other: npt.NDArray[np.object_]) -> npt.NDArray[np.object_]: ... @overload - def __rsub__(self, other: BaseOffset) -> Self: ... + def __rsub__(self, other: _DatetimeT) -> _DatetimeT: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload] @overload - def __rsub__(self, other: _DatetimeT) -> _DatetimeT: ... + def __rsub__(self, other: date) -> Timestamp: ... + @overload + def __rsub__(self, other: BaseOffset) -> Self: ... @overload def __rsub__(self, other: _TimedeltaT) -> _TimedeltaT: ... def __call__(self, other): ... diff --git a/tests/test_timefuncs.py b/tests/test_timefuncs.py index ed6cf910e..9722c314d 100644 --- a/tests/test_timefuncs.py +++ b/tests/test_timefuncs.py @@ -664,8 +664,13 @@ def test_some_offsets() -> None: ), pd.DatetimeIndex, ) - # GH 224 - check(assert_type(dt.date.today() - Day(), dt.date), dt.date) + # GH 755 + check(assert_type(dt.date.today() - Day(), pd.Timestamp), pd.Timestamp) + check(assert_type(dt.date.today() + Day(), pd.Timestamp), pd.Timestamp) + check(assert_type(Day() + dt.date.today(), pd.Timestamp), pd.Timestamp) + check(assert_type(dt.datetime.now() - Day(), dt.datetime), dt.datetime) + check(assert_type(dt.datetime.now() + Day(), dt.datetime), dt.datetime) + check(assert_type(Day() + dt.datetime.now(), dt.datetime), dt.datetime) # GH 235 check( assert_type(