24
24
# left operands
25
25
left_i = pd .DataFrame ({"a" : [1 , 2 , 3 ]})["a" ]
26
26
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" ]
27
28
28
29
29
30
def test_sub_i_py_scalar () -> None :
@@ -154,23 +155,44 @@ def test_sub_i_pd_series() -> None:
154
155
155
156
156
157
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"""
158
159
s = anchor
159
160
a = [s + timedelta (minutes = m ) for m in range (3 )]
160
161
161
162
check (assert_type (left_ts - s , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
162
163
if TYPE_CHECKING_INVALID_USAGE :
164
+ # Series[Any] (Timestamp) - Sequence[datetime] should work, see pandas-dev/pandas#62353
163
165
_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]
164
175
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 )
166
177
if TYPE_CHECKING_INVALID_USAGE :
178
+ # Sequence[datetime] - Series[Any] (Timestamp) should work, see pandas-dev/pandas#62353
167
179
_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]
168
184
169
185
check (assert_type (left_ts .sub (s ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
170
186
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)
171
191
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 )
174
196
175
197
176
198
def test_sub_ts_numpy_datetime () -> None :
@@ -180,23 +202,41 @@ def test_sub_ts_numpy_datetime() -> None:
180
202
181
203
check (assert_type (left_ts - s , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
182
204
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
183
210
184
211
# `numpy` typing gives the corresponding `ndarray`s in the static type
185
212
# checking, where our `__rsub__` cannot override. At runtime, they return
186
213
# `Series`.
187
214
# 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 )
189
216
check (
190
217
assert_type (a - left_ts , Any ), # pyright: ignore[reportAssertTypeFailure]
191
218
pd .Series ,
192
219
pd .Timedelta ,
193
220
)
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
+ )
194
227
195
228
check (assert_type (left_ts .sub (s ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
196
229
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)
197
235
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 )
200
240
201
241
202
242
def test_sub_ts_pd_datetime () -> None :
@@ -206,17 +246,31 @@ def test_sub_ts_pd_datetime() -> None:
206
246
207
247
check (assert_type (left_ts - s , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
208
248
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
209
254
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 )
211
256
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 )
212
259
213
260
check (assert_type (left_ts .sub (s ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
214
261
check (
215
262
assert_type (left_ts .sub (a ), "pd.Series[pd.Timedelta]" ), pd .Series , pd .Timedelta
216
263
)
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)
217
269
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 )
219
271
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 )
220
274
221
275
222
276
def test_sub_str_py_str () -> None :
0 commit comments