Skip to content

Commit a0ae00d

Browse files
committed
fix(comment): test_sub
1 parent a488907 commit a0ae00d

File tree

3 files changed

+76
-14
lines changed

3 files changed

+76
-14
lines changed

pandas-stubs/core/series.pyi

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3050,10 +3050,13 @@ class Series(IndexOpsMixin[S1], NDFrame):
30503050
axis: int = 0,
30513051
) -> TimedeltaSeries: ...
30523052
@overload
3053-
def __rsub__(
3053+
def __rsub__( # type: ignore[overload-overlap]
30543054
self: Series[Never],
30553055
other: (
30563056
complex
3057+
| datetime
3058+
| np.datetime64
3059+
| np_ndarray_dt
30573060
| NumListLike
30583061
| Index[T_COMPLEX]
30593062
| Series[T_COMPLEX]
@@ -3160,13 +3163,18 @@ class Series(IndexOpsMixin[S1], NDFrame):
31603163
) -> Series[Timedelta]: ...
31613164
@overload
31623165
def __rsub__(
3163-
self: Series[Timedelta], other: Series[Timestamp]
3166+
self: Series[Timedelta],
3167+
other: datetime | np.datetime64 | np_ndarray_dt | Series[Timestamp],
31643168
) -> Series[Timestamp]: ...
31653169
@overload
3166-
def rsub(
3170+
def rsub( # type: ignore[overload-overlap]
31673171
self: Series[Never],
31683172
other: (
31693173
complex
3174+
| datetime
3175+
| Sequence[datetime]
3176+
| np.datetime64
3177+
| np_ndarray_dt
31703178
| NumListLike
31713179
| Index[T_COMPLEX]
31723180
| Series[T_COMPLEX]
@@ -3312,7 +3320,7 @@ class Series(IndexOpsMixin[S1], NDFrame):
33123320
@overload
33133321
def rsub(
33143322
self: Series[Timedelta],
3315-
other: Series[Timestamp],
3323+
other: datetime | np.datetime64 | np_ndarray_dt | Series[Timestamp],
33163324
level: Level | None = None,
33173325
fill_value: float | None = None,
33183326
axis: int = 0,

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pyarrow = ">=10.0.1"
4242
pytest = ">=7.1.2"
4343
pyright = ">=1.1.405"
4444
ty = ">=0.0.1a20"
45-
pyrefly = ">=0.32.0"
45+
pyrefly = ">=0.33.0"
4646
poethepoet = ">=0.16.5"
4747
loguru = ">=0.6.0"
4848
typing-extensions = ">=4.4.0"

tests/series/arithmetic/test_sub.py

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
# left operands
2525
left_i = pd.DataFrame({"a": [1, 2, 3]})["a"]
2626
left_ts = pd.DataFrame({"a": [anchor + timedelta(hours=h + 1) for h in range(3)]})["a"]
27+
left_td = pd.DataFrame({"a": [timedelta(hours=h, minutes=1) for h in range(3)]})["a"]
2728

2829

2930
def test_sub_i_py_scalar() -> None:
@@ -154,23 +155,44 @@ def test_sub_i_pd_series() -> None:
154155

155156

156157
def test_sub_ts_py_datetime() -> None:
157-
"""Test pd.Series[Any] (Timestamp) - Python native datetime"""
158+
"""Test pd.Series[Any] (Timestamp | Timedelta) - Python native datetime"""
158159
s = anchor
159160
a = [s + timedelta(minutes=m) for m in range(3)]
160161

161162
check(assert_type(left_ts - s, "TimedeltaSeries"), pd.Series, pd.Timedelta)
162163
if TYPE_CHECKING_INVALID_USAGE:
164+
# Series[Any] (Timestamp) - Sequence[datetime] should work, see pandas-dev/pandas#62353
163165
_1 = left_ts - a # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
166+
# Series[Any] (Timedelta) - datetime fails at runtime,
167+
# which cannot be revealed by our static type checking
168+
# _2 = left_td - s
169+
if TYPE_CHECKING_INVALID_USAGE:
170+
# Series[Any] (Timedelta) - Sequence[datetime] is not supported by Pandas,
171+
# see pandas-dev/pandas#62353. Even if such __sub__ is supported
172+
# it will fail at runtime here,
173+
# which cannot be revealed by our static type checking
174+
_3 = left_td - a # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
164175

165-
check(assert_type(s - left_ts, "TimedeltaSeries"), pd.Series, pd.Timedelta)
176+
check(assert_type(s - left_ts, pd.Series), pd.Series, pd.Timedelta)
166177
if TYPE_CHECKING_INVALID_USAGE:
178+
# Sequence[datetime] - Series[Any] (Timestamp) should work, see pandas-dev/pandas#62353
167179
_5 = a - left_ts # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
180+
check(assert_type(s - left_td, pd.Series), pd.Series, pd.Timestamp)
181+
if TYPE_CHECKING_INVALID_USAGE:
182+
# Sequence[datetime] - Series[Any] (Timedelta) should work, see pandas-dev/pandas#62353
183+
_7 = a - left_td # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
168184

169185
check(assert_type(left_ts.sub(s), "TimedeltaSeries"), pd.Series, pd.Timedelta)
170186
check(assert_type(left_ts.sub(a), "TimedeltaSeries"), pd.Series, pd.Timedelta)
187+
# Series[Any] (Timedelta).sub(datetime or Sequence[datetime]) fails at runtime,
188+
# which cannot be revealed by our static type checking
189+
# left_td.sub(s)
190+
# left_td.sub(a)
171191

172-
check(assert_type(left_ts.rsub(s), "TimedeltaSeries"), pd.Series, pd.Timedelta)
173-
check(assert_type(left_ts.rsub(a), "TimedeltaSeries"), pd.Series, pd.Timedelta)
192+
check(assert_type(left_ts.rsub(s), pd.Series), pd.Series, pd.Timedelta)
193+
check(assert_type(left_ts.rsub(a), pd.Series), pd.Series, pd.Timedelta)
194+
check(assert_type(left_td.rsub(s), pd.Series), pd.Series, pd.Timestamp)
195+
check(assert_type(left_td.rsub(a), pd.Series), pd.Series, pd.Timestamp)
174196

175197

176198
def test_sub_ts_numpy_datetime() -> None:
@@ -180,23 +202,41 @@ def test_sub_ts_numpy_datetime() -> None:
180202

181203
check(assert_type(left_ts - s, "TimedeltaSeries"), pd.Series, pd.Timedelta)
182204
check(assert_type(left_ts - a, "TimedeltaSeries"), pd.Series, pd.Timedelta)
205+
# Series[Any] (Timedelta) - np.datetime64 or np.NDArray[np.datetime64]
206+
# fails at runtime,
207+
# which cannot be revealed by our static type checking
208+
# left_td - s
209+
# left_td - a
183210

184211
# `numpy` typing gives the corresponding `ndarray`s in the static type
185212
# checking, where our `__rsub__` cannot override. At runtime, they return
186213
# `Series`.
187214
# microsoft/pyright#10924
188-
check(assert_type(s - left_ts, "TimedeltaSeries"), pd.Series, pd.Timedelta)
215+
check(assert_type(s - left_ts, pd.Series), pd.Series, pd.Timedelta)
189216
check(
190217
assert_type(a - left_ts, Any), # pyright: ignore[reportAssertTypeFailure]
191218
pd.Series,
192219
pd.Timedelta,
193220
)
221+
check(assert_type(s - left_td, pd.Series), pd.Series, pd.Timestamp)
222+
check(
223+
assert_type(a - left_td, Any), # pyright: ignore[reportAssertTypeFailure]
224+
pd.Series,
225+
pd.Timestamp,
226+
)
194227

195228
check(assert_type(left_ts.sub(s), "TimedeltaSeries"), pd.Series, pd.Timedelta)
196229
check(assert_type(left_ts.sub(a), "TimedeltaSeries"), pd.Series, pd.Timedelta)
230+
# Series[Any] (Timedelta).sub(np.datetime64 or np.NDArray[np.datetime64])
231+
# fails at runtime,
232+
# which cannot be revealed by our static type checking
233+
# left_td.sub(s)
234+
# left_td.sub(a)
197235

198-
check(assert_type(left_ts.rsub(s), "TimedeltaSeries"), pd.Series, pd.Timedelta)
199-
check(assert_type(left_ts.rsub(a), "TimedeltaSeries"), pd.Series, pd.Timedelta)
236+
check(assert_type(left_ts.rsub(s), pd.Series), pd.Series, pd.Timedelta)
237+
check(assert_type(left_ts.rsub(a), pd.Series), pd.Series, pd.Timedelta)
238+
check(assert_type(left_td.rsub(s), pd.Series), pd.Series, pd.Timestamp)
239+
check(assert_type(left_td.rsub(a), pd.Series), pd.Series, pd.Timestamp)
200240

201241

202242
def test_sub_ts_pd_datetime() -> None:
@@ -206,17 +246,31 @@ def test_sub_ts_pd_datetime() -> None:
206246

207247
check(assert_type(left_ts - s, "TimedeltaSeries"), pd.Series, pd.Timedelta)
208248
check(assert_type(left_ts - a, "pd.Series[pd.Timedelta]"), pd.Series, pd.Timedelta)
249+
# Series[Any] (Timedelta) - Timestamp or Seriesp[Timestamp]
250+
# fails at runtime,
251+
# which cannot be revealed by our static type checking
252+
# left_td - s
253+
# left_td - a
209254

210-
check(assert_type(s - left_ts, "TimedeltaSeries"), pd.Series, pd.Timedelta)
255+
check(assert_type(s - left_ts, pd.Series), pd.Series, pd.Timedelta)
211256
check(assert_type(a - left_ts, pd.Series), pd.Series, pd.Timedelta)
257+
check(assert_type(s - left_td, pd.Series), pd.Series, pd.Timestamp)
258+
check(assert_type(a - left_td, pd.Series), pd.Series, pd.Timestamp)
212259

213260
check(assert_type(left_ts.sub(s), "TimedeltaSeries"), pd.Series, pd.Timedelta)
214261
check(
215262
assert_type(left_ts.sub(a), "pd.Series[pd.Timedelta]"), pd.Series, pd.Timedelta
216263
)
264+
# Series[Any] (Timedelta).sub(Timestamp or Seriesp[Timestamp])
265+
# fails at runtime,
266+
# which cannot be revealed by our static type checking
267+
# left_td.sub(s)
268+
# left_td.sub(a)
217269

218-
check(assert_type(left_ts.rsub(s), "TimedeltaSeries"), pd.Series, pd.Timedelta)
270+
check(assert_type(left_ts.rsub(s), pd.Series), pd.Series, pd.Timedelta)
219271
check(assert_type(left_ts.rsub(a), pd.Series), pd.Series, pd.Timedelta)
272+
check(assert_type(left_td.rsub(s), pd.Series), pd.Series, pd.Timestamp)
273+
check(assert_type(left_td.rsub(a), pd.Series), pd.Series, pd.Timestamp)
220274

221275

222276
def test_sub_str_py_str() -> None:

0 commit comments

Comments
 (0)