1
- from typing import NoReturn
1
+ from datetime import (
2
+ datetime ,
3
+ timedelta ,
4
+ )
5
+ from typing import (
6
+ TYPE_CHECKING ,
7
+ NoReturn ,
8
+ )
2
9
3
10
import numpy as np
4
11
from numpy import typing as npt # noqa: F401
7
14
8
15
from tests import check
9
16
10
- left = pd .DataFrame ({"a" : [1 , 2 , 3 ]})["a" ] # left operand
17
+ if TYPE_CHECKING :
18
+ from pandas .core .series import TimedeltaSeries # noqa: F401
19
+
20
+ left_i = pd .DataFrame ({"a" : [1 , 2 , 3 ]})["a" ] # left operand
11
21
12
22
13
23
def test_sub_py_scalar () -> None :
14
24
"""Test pd.Series[Any] - Python native scalars"""
15
25
b , i , f , c = True , 1 , 1.0 , 1j
16
26
17
- check (assert_type (left - b , pd .Series ), pd .Series )
18
- check (assert_type (left - i , pd .Series ), pd .Series )
19
- check (assert_type (left - f , pd .Series ), pd .Series )
20
- check (assert_type (left - c , pd .Series ), pd .Series )
27
+ check (assert_type (left_i - b , pd .Series ), pd .Series )
28
+ check (assert_type (left_i - i , pd .Series ), pd .Series )
29
+ check (assert_type (left_i - f , pd .Series ), pd .Series )
30
+ check (assert_type (left_i - c , pd .Series ), pd .Series )
21
31
22
- check (assert_type (b - left , pd .Series ), pd .Series )
23
- check (assert_type (i - left , pd .Series ), pd .Series )
24
- check (assert_type (f - left , pd .Series ), pd .Series )
25
- check (assert_type (c - left , pd .Series ), pd .Series )
32
+ check (assert_type (b - left_i , pd .Series ), pd .Series )
33
+ check (assert_type (i - left_i , pd .Series ), pd .Series )
34
+ check (assert_type (f - left_i , pd .Series ), pd .Series )
35
+ check (assert_type (c - left_i , pd .Series ), pd .Series )
26
36
27
- check (assert_type (left .sub (b ), pd .Series ), pd .Series )
28
- check (assert_type (left .sub (i ), pd .Series ), pd .Series )
29
- check (assert_type (left .sub (f ), pd .Series ), pd .Series )
30
- check (assert_type (left .sub (c ), pd .Series ), pd .Series )
37
+ check (assert_type (left_i .sub (b ), pd .Series ), pd .Series )
38
+ check (assert_type (left_i .sub (i ), pd .Series ), pd .Series )
39
+ check (assert_type (left_i .sub (f ), pd .Series ), pd .Series )
40
+ check (assert_type (left_i .sub (c ), pd .Series ), pd .Series )
31
41
32
- check (assert_type (left .rsub (b ), pd .Series ), pd .Series )
33
- check (assert_type (left .rsub (i ), pd .Series ), pd .Series )
34
- check (assert_type (left .rsub (f ), pd .Series ), pd .Series )
35
- check (assert_type (left .rsub (c ), pd .Series ), pd .Series )
42
+ check (assert_type (left_i .rsub (b ), pd .Series ), pd .Series )
43
+ check (assert_type (left_i .rsub (i ), pd .Series ), pd .Series )
44
+ check (assert_type (left_i .rsub (f ), pd .Series ), pd .Series )
45
+ check (assert_type (left_i .rsub (c ), pd .Series ), pd .Series )
36
46
37
47
38
48
def test_sub_py_sequence () -> None :
39
49
"""Test pd.Series[Any] - Python native sequence"""
40
50
b , i , f , c = [True , False , True ], [2 , 3 , 5 ], [1.0 , 2.0 , 3.0 ], [1j , 1j , 4j ]
41
51
42
- check (assert_type (left - b , pd .Series ), pd .Series )
43
- check (assert_type (left - i , pd .Series ), pd .Series )
44
- check (assert_type (left - f , pd .Series ), pd .Series )
45
- check (assert_type (left - c , pd .Series ), pd .Series )
52
+ check (assert_type (left_i - b , pd .Series ), pd .Series )
53
+ check (assert_type (left_i - i , pd .Series ), pd .Series )
54
+ check (assert_type (left_i - f , pd .Series ), pd .Series )
55
+ check (assert_type (left_i - c , pd .Series ), pd .Series )
46
56
47
- check (assert_type (b - left , pd .Series ), pd .Series )
48
- check (assert_type (i - left , pd .Series ), pd .Series )
49
- check (assert_type (f - left , pd .Series ), pd .Series )
50
- check (assert_type (c - left , pd .Series ), pd .Series )
57
+ check (assert_type (b - left_i , pd .Series ), pd .Series )
58
+ check (assert_type (i - left_i , pd .Series ), pd .Series )
59
+ check (assert_type (f - left_i , pd .Series ), pd .Series )
60
+ check (assert_type (c - left_i , pd .Series ), pd .Series )
51
61
52
- check (assert_type (left .sub (b ), pd .Series ), pd .Series )
53
- check (assert_type (left .sub (i ), pd .Series ), pd .Series )
54
- check (assert_type (left .sub (f ), pd .Series ), pd .Series )
55
- check (assert_type (left .sub (c ), pd .Series ), pd .Series )
62
+ check (assert_type (left_i .sub (b ), pd .Series ), pd .Series )
63
+ check (assert_type (left_i .sub (i ), pd .Series ), pd .Series )
64
+ check (assert_type (left_i .sub (f ), pd .Series ), pd .Series )
65
+ check (assert_type (left_i .sub (c ), pd .Series ), pd .Series )
56
66
57
- check (assert_type (left .rsub (b ), pd .Series ), pd .Series )
58
- check (assert_type (left .rsub (i ), pd .Series ), pd .Series )
59
- check (assert_type (left .rsub (f ), pd .Series ), pd .Series )
60
- check (assert_type (left .rsub (c ), pd .Series ), pd .Series )
67
+ check (assert_type (left_i .rsub (b ), pd .Series ), pd .Series )
68
+ check (assert_type (left_i .rsub (i ), pd .Series ), pd .Series )
69
+ check (assert_type (left_i .rsub (f ), pd .Series ), pd .Series )
70
+ check (assert_type (left_i .rsub (c ), pd .Series ), pd .Series )
61
71
62
72
63
73
def test_sub_numpy_array () -> None :
@@ -67,35 +77,35 @@ def test_sub_numpy_array() -> None:
67
77
f = np .array ([1.0 , 2.0 , 3.0 ], np .float64 )
68
78
c = np .array ([1.1j , 2.2j , 4.1j ], np .complex128 )
69
79
70
- check (assert_type (left - b , pd .Series ), pd .Series )
71
- check (assert_type (left - i , pd .Series ), pd .Series )
72
- check (assert_type (left - f , pd .Series ), pd .Series )
73
- check (assert_type (left - c , pd .Series ), pd .Series )
80
+ check (assert_type (left_i - b , pd .Series ), pd .Series )
81
+ check (assert_type (left_i - i , pd .Series ), pd .Series )
82
+ check (assert_type (left_i - f , pd .Series ), pd .Series )
83
+ check (assert_type (left_i - c , pd .Series ), pd .Series )
74
84
75
85
# `numpy` typing gives the corresponding `ndarray`s in the static type
76
86
# checking, where our `__rsub__` cannot override. At runtime, they return
77
87
# `Series`s.
78
88
# `mypy` thinks the return types are `Any`, which is a bug.
79
- check (assert_type (b - left , NoReturn ), pd .Series ) # type: ignore[assert-type]
89
+ check (assert_type (b - left_i , NoReturn ), pd .Series ) # type: ignore[assert-type]
80
90
check (
81
- assert_type (i - left , "npt.NDArray[np.int64]" ), pd .Series # type: ignore[assert-type]
91
+ assert_type (i - left_i , "npt.NDArray[np.int64]" ), pd .Series # type: ignore[assert-type]
82
92
)
83
93
check (
84
- assert_type (f - left , "npt.NDArray[np.float64]" ), pd .Series # type: ignore[assert-type]
94
+ assert_type (f - left_i , "npt.NDArray[np.float64]" ), pd .Series # type: ignore[assert-type]
85
95
)
86
96
check (
87
- assert_type (c - left , "npt.NDArray[np.complex128]" ), pd .Series # type: ignore[assert-type]
97
+ assert_type (c - left_i , "npt.NDArray[np.complex128]" ), pd .Series # type: ignore[assert-type]
88
98
)
89
99
90
- check (assert_type (left .sub (b ), pd .Series ), pd .Series )
91
- check (assert_type (left .sub (i ), pd .Series ), pd .Series )
92
- check (assert_type (left .sub (f ), pd .Series ), pd .Series )
93
- check (assert_type (left .sub (c ), pd .Series ), pd .Series )
100
+ check (assert_type (left_i .sub (b ), pd .Series ), pd .Series )
101
+ check (assert_type (left_i .sub (i ), pd .Series ), pd .Series )
102
+ check (assert_type (left_i .sub (f ), pd .Series ), pd .Series )
103
+ check (assert_type (left_i .sub (c ), pd .Series ), pd .Series )
94
104
95
- check (assert_type (left .rsub (b ), pd .Series ), pd .Series )
96
- check (assert_type (left .rsub (i ), pd .Series ), pd .Series )
97
- check (assert_type (left .rsub (f ), pd .Series ), pd .Series )
98
- check (assert_type (left .rsub (c ), pd .Series ), pd .Series )
105
+ check (assert_type (left_i .rsub (b ), pd .Series ), pd .Series )
106
+ check (assert_type (left_i .rsub (i ), pd .Series ), pd .Series )
107
+ check (assert_type (left_i .rsub (f ), pd .Series ), pd .Series )
108
+ check (assert_type (left_i .rsub (c ), pd .Series ), pd .Series )
99
109
100
110
101
111
def test_sub_pd_series () -> None :
@@ -105,22 +115,78 @@ def test_sub_pd_series() -> None:
105
115
f = pd .Series ([1.0 , 2.0 , 3.0 ])
106
116
c = pd .Series ([1.1j , 2.2j , 4.1j ])
107
117
108
- check (assert_type (left - b , pd .Series ), pd .Series )
109
- check (assert_type (left - i , pd .Series ), pd .Series )
110
- check (assert_type (left - f , pd .Series ), pd .Series )
111
- check (assert_type (left - c , pd .Series ), pd .Series )
112
-
113
- check (assert_type (b - left , pd .Series ), pd .Series )
114
- check (assert_type (i - left , pd .Series ), pd .Series )
115
- check (assert_type (f - left , pd .Series ), pd .Series )
116
- check (assert_type (c - left , pd .Series ), pd .Series )
117
-
118
- check (assert_type (left .sub (b ), pd .Series ), pd .Series )
119
- check (assert_type (left .sub (i ), pd .Series ), pd .Series )
120
- check (assert_type (left .sub (f ), pd .Series ), pd .Series )
121
- check (assert_type (left .sub (c ), pd .Series ), pd .Series )
122
-
123
- check (assert_type (left .rsub (b ), pd .Series ), pd .Series )
124
- check (assert_type (left .rsub (i ), pd .Series ), pd .Series )
125
- check (assert_type (left .rsub (f ), pd .Series ), pd .Series )
126
- check (assert_type (left .rsub (c ), pd .Series ), pd .Series )
118
+ check (assert_type (left_i - b , pd .Series ), pd .Series )
119
+ check (assert_type (left_i - i , pd .Series ), pd .Series )
120
+ check (assert_type (left_i - f , pd .Series ), pd .Series )
121
+ check (assert_type (left_i - c , pd .Series ), pd .Series )
122
+
123
+ check (assert_type (b - left_i , pd .Series ), pd .Series )
124
+ check (assert_type (i - left_i , pd .Series ), pd .Series )
125
+ check (assert_type (f - left_i , pd .Series ), pd .Series )
126
+ check (assert_type (c - left_i , pd .Series ), pd .Series )
127
+
128
+ check (assert_type (left_i .sub (b ), pd .Series ), pd .Series )
129
+ check (assert_type (left_i .sub (i ), pd .Series ), pd .Series )
130
+ check (assert_type (left_i .sub (f ), pd .Series ), pd .Series )
131
+ check (assert_type (left_i .sub (c ), pd .Series ), pd .Series )
132
+
133
+ check (assert_type (left_i .rsub (b ), pd .Series ), pd .Series )
134
+ check (assert_type (left_i .rsub (i ), pd .Series ), pd .Series )
135
+ check (assert_type (left_i .rsub (f ), pd .Series ), pd .Series )
136
+ check (assert_type (left_i .rsub (c ), pd .Series ), pd .Series )
137
+
138
+
139
+ anchor = datetime (2025 , 8 , 18 )
140
+ left_ts = pd .DataFrame ({"a" : [anchor + timedelta (hours = h + 1 ) for h in range (3 )]})["a" ]
141
+
142
+
143
+ def test_sub_py_datetime () -> None :
144
+ """Test pd.Series[Any] - Python native datetime(s)"""
145
+ s = anchor
146
+
147
+ check (assert_type (left_ts - s , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
148
+
149
+ check (assert_type (s - left_ts , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
150
+
151
+ check (assert_type (left_ts .sub (s ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
152
+
153
+ check (assert_type (left_ts .rsub (s ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
154
+
155
+
156
+ def test_sub_numpy_datetime () -> None :
157
+ """Test pd.Series[Any] - numpy datetime(s)"""
158
+ s = np .datetime64 (anchor )
159
+ a = np .array ([s + np .timedelta64 (m , "m" ) for m in range (3 )])
160
+
161
+ # `numpy` typing gives the corresponding `ndarray`s in the static type
162
+ # checking, where our `__rsub__` cannot override. At runtime, they return
163
+ # `Series`s.
164
+ check (assert_type (left_ts - s , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
165
+ check (assert_type (left_ts - a , "TimedeltaSeries" ), pd .Series , pd .Timedelta ) # type: ignore[assert-type]
166
+
167
+ check (assert_type (s - left_ts , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
168
+ check (assert_type (a - left_ts , "npt.NDArray[np.datetime64]" ), pd .Series , pd .Timedelta ) # type: ignore[assert-type]
169
+
170
+ check (assert_type (left_ts .sub (s ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
171
+ check (assert_type (left_ts .sub (a ), "TimedeltaSeries" ), pd .Series , pd .Timedelta ) # type: ignore[assert-type]
172
+
173
+ check (assert_type (left_ts .rsub (s ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
174
+ check (assert_type (left_ts .rsub (a ), "TimedeltaSeries" ), pd .Series , pd .Timedelta ) # type: ignore[assert-type]
175
+
176
+
177
+ def test_sub_pd_datetime () -> None :
178
+ """Test pd.Series[Any] - Pandas datetime(s)"""
179
+ s = pd .Timestamp (anchor )
180
+ a = pd .Series ([s + pd .Timedelta (minutes = m ) for m in range (3 )])
181
+
182
+ check (assert_type (left_ts - s , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
183
+ check (assert_type (left_ts - a , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
184
+
185
+ check (assert_type (s - left_ts , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
186
+ check (assert_type (a - left_ts , "TimedeltaSeries" ), pd .Series , pd .Timedelta )
187
+
188
+ check (assert_type (left_ts .sub (s ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
189
+ check (assert_type (left_ts .sub (a ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
190
+
191
+ check (assert_type (left_ts .rsub (s ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
192
+ check (assert_type (left_ts .rsub (a ), "TimedeltaSeries" ), pd .Series , pd .Timedelta )
0 commit comments