Skip to content

make tslibs strptime, timedeltas, and timestamps pass with pyright-strict #1151

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Mar 12, 2025
Merged
1 change: 1 addition & 0 deletions pandas-stubs/_libs/tslibs/strptime.pyi
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# pyright
from typing import Any

def array_strptime(*args, **kwargs) -> Any: ...
5 changes: 4 additions & 1 deletion pandas-stubs/_libs/tslibs/timedeltas.pyi
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# pyright: strict
import datetime as dt
from datetime import timedelta
from typing import (
Expand Down Expand Up @@ -241,7 +242,9 @@ class Timedelta(timedelta):
@overload
def __rmul__(self, other: float) -> Timedelta: ...
@overload
def __rmul__(self, other: np.ndarray) -> np.ndarray: ...
def __rmul__(
self, other: npt.NDArray[np.floating] | npt.NDArray[np.integer]
) -> npt.NDArray[np.timedelta64]: ...
@overload
def __rmul__(self, other: Series[int]) -> TimedeltaSeries: ...
@overload
Expand Down
23 changes: 16 additions & 7 deletions pandas-stubs/_libs/tslibs/timestamps.pyi
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# pyright: strict
from datetime import (
_IsoCalendarDate,
date as _date,
datetime,
time as _time,
timedelta,
tzinfo as _tzinfo,
)
from datetime import _IsoCalendarDate # pyright: ignore[reportPrivateUsage]
import sys
from time import struct_time
from typing import (
Expand Down Expand Up @@ -166,25 +167,33 @@ class Timestamp(datetime, SupportsIndex):
@overload # type: ignore[override]
def __le__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[misc]
@overload
def __le__(self, other: Index | npt.NDArray[np.datetime64]) -> np_ndarray_bool: ...
def __le__(
self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
) -> np_ndarray_bool: ...
@overload
def __le__(self, other: TimestampSeries) -> Series[bool]: ...
@overload # type: ignore[override]
def __lt__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[misc]
@overload
def __lt__(self, other: Index | npt.NDArray[np.datetime64]) -> np_ndarray_bool: ...
def __lt__(
self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
) -> np_ndarray_bool: ...
@overload
def __lt__(self, other: TimestampSeries) -> Series[bool]: ...
@overload # type: ignore[override]
def __ge__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[misc]
@overload
def __ge__(self, other: Index | npt.NDArray[np.datetime64]) -> np_ndarray_bool: ...
def __ge__(
self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
) -> np_ndarray_bool: ...
@overload
def __ge__(self, other: TimestampSeries) -> Series[bool]: ...
@overload # type: ignore[override]
def __gt__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[misc]
@overload
def __gt__(self, other: Index | npt.NDArray[np.datetime64]) -> np_ndarray_bool: ...
def __gt__(
self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
) -> np_ndarray_bool: ...
@overload
def __gt__(self, other: TimestampSeries) -> Series[bool]: ...
# error: Signature of "__add__" incompatible with supertype "date"/"datetime"
Expand Down Expand Up @@ -224,15 +233,15 @@ class Timestamp(datetime, SupportsIndex):
@overload
def __eq__(self, other: TimestampSeries) -> Series[bool]: ... # type: ignore[overload-overlap]
@overload
def __eq__(self, other: npt.NDArray[np.datetime64] | Index) -> np_ndarray_bool: ... # type: ignore[overload-overlap]
def __eq__(self, other: npt.NDArray[np.datetime64] | Index[Timestamp]) -> np_ndarray_bool: ... # type: ignore[overload-overlap]
@overload
def __eq__(self, other: object) -> Literal[False]: ...
@overload
def __ne__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
@overload
def __ne__(self, other: TimestampSeries) -> Series[bool]: ... # type: ignore[overload-overlap]
@overload
def __ne__(self, other: npt.NDArray[np.datetime64] | Index) -> np_ndarray_bool: ... # type: ignore[overload-overlap]
def __ne__(self, other: npt.NDArray[np.datetime64] | Index[Timestamp]) -> np_ndarray_bool: ... # type: ignore[overload-overlap]
@overload
def __ne__(self, other: object) -> Literal[True]: ...
def __hash__(self) -> int: ...
Expand Down
12 changes: 10 additions & 2 deletions tests/test_scalars.py
Original file line number Diff line number Diff line change
Expand Up @@ -713,8 +713,16 @@ def test_timedelta_mul_div() -> None:

check(assert_type(md_int * td, pd.Timedelta), pd.Timedelta)
check(assert_type(md_float * td, pd.Timedelta), pd.Timedelta)
check(assert_type(md_ndarray_intp * td, np.ndarray), np.ndarray, np.timedelta64)
check(assert_type(md_ndarray_float * td, np.ndarray), np.ndarray, np.timedelta64)
check(
assert_type(md_ndarray_intp * td, npt.NDArray[np.timedelta64]),
np.ndarray,
np.timedelta64,
)
check(
assert_type(md_ndarray_float * td, npt.NDArray[np.timedelta64]),
np.ndarray,
np.timedelta64,
)
check(assert_type(mp_series_int * td, TimedeltaSeries), pd.Series, pd.Timedelta)
check(assert_type(md_series_float * td, TimedeltaSeries), pd.Series, pd.Timedelta)
check(assert_type(md_int64_index * td, pd.TimedeltaIndex), pd.TimedeltaIndex)
Expand Down
Loading