5
5
import pandas as pd
6
6
from typing_extensions import assert_type
7
7
8
- from tests import check
8
+ from tests import (
9
+ TYPE_CHECKING_INVALID_USAGE ,
10
+ check ,
11
+ )
9
12
10
13
11
- def test_interval () -> None :
14
+ def test_interval_constructor () -> None :
12
15
i0 = pd .Interval (0 , 1 , closed = "left" )
13
16
i1 = pd .Interval (0.0 , 1.0 , closed = "right" )
14
17
i2 = pd .Interval (
@@ -20,6 +23,15 @@ def test_interval() -> None:
20
23
check (assert_type (i2 , "pd.Interval[pd.Timestamp]" ), pd .Interval )
21
24
check (assert_type (i3 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
22
25
26
+
27
+ def test_interval_properties () -> None :
28
+ i0 = pd .Interval (0 , 1 , closed = "left" )
29
+ i1 = pd .Interval (0.0 , 1.0 , closed = "right" )
30
+ i2 = pd .Interval (
31
+ pd .Timestamp ("2017-01-01" ), pd .Timestamp ("2017-01-02" ), closed = "both"
32
+ )
33
+ i3 = pd .Interval (pd .Timedelta ("1 days" ), pd .Timedelta ("2 days" ), closed = "neither" )
34
+
23
35
check (assert_type (i0 .closed , Literal ["left" , "right" , "both" , "neither" ]), str )
24
36
check (assert_type (i0 .closed_left , bool ), bool )
25
37
check (assert_type (i0 .closed_right , bool ), bool )
@@ -64,6 +76,15 @@ def test_interval() -> None:
64
76
check (assert_type (i3 .open_right , bool ), bool )
65
77
check (assert_type (i3 .right , pd .Timedelta ), pd .Timedelta )
66
78
79
+
80
+ def test_interval_methods () -> None :
81
+ i0 = pd .Interval (0 , 1 , closed = "left" )
82
+ i1 = pd .Interval (0.0 , 1.0 , closed = "right" )
83
+ i2 = pd .Interval (
84
+ pd .Timestamp ("2017-01-01" ), pd .Timestamp ("2017-01-02" ), closed = "both"
85
+ )
86
+ i3 = pd .Interval (pd .Timedelta ("1 days" ), pd .Timedelta ("2 days" ), closed = "neither" )
87
+
67
88
check (assert_type (i0 .overlaps (pd .Interval (0.5 , 1.5 , closed = "left" )), bool ), bool )
68
89
check (assert_type (i0 .overlaps (pd .Interval (2 , 3 , closed = "left" )), bool ), bool )
69
90
@@ -76,73 +97,119 @@ def test_interval() -> None:
76
97
td2 = pd .Timedelta (days = 3 )
77
98
check (assert_type (i3 .overlaps (pd .Interval (td1 , td2 , closed = "left" )), bool ), bool )
78
99
79
- check (assert_type (i0 * 3 , "pd.Interval[int]" ), pd .Interval )
80
- check (assert_type (i1 * 3 , "pd.Interval[float]" ), pd .Interval )
81
- check (assert_type (i3 * 3 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
82
100
83
- check (assert_type (i0 * 3.5 , "pd.Interval[float]" ), pd .Interval )
84
- check (assert_type (i1 * 3.5 , "pd.Interval[float]" ), pd .Interval )
85
- check (assert_type (i3 * 3.5 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
101
+ def test_interval_math () -> None :
102
+ i0 = pd .Interval (0 , 1 , closed = "left" )
103
+ i1 = pd .Interval (0.0 , 1.0 , closed = "right" )
104
+ i2 = pd .Interval (
105
+ pd .Timestamp ("2017-01-01" ), pd .Timestamp ("2017-01-02" ), closed = "both"
106
+ )
107
+ i3 = pd .Interval (pd .Timedelta ("1 days" ), pd .Timedelta ("2 days" ), closed = "neither" )
86
108
87
- check (assert_type (3 * i0 , "pd.Interval[int]" ), pd .Interval )
88
- check (assert_type (3 * i1 , "pd.Interval[float]" ), pd .Interval )
89
- check (assert_type (3 * i3 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
109
+ md1 = 3
110
+ md2 = 3.5
90
111
91
- check (assert_type (3.5 * i0 , "pd.Interval[float]" ), pd .Interval )
92
- check (assert_type (3.5 * i1 , "pd.Interval[float]" ), pd .Interval )
93
- check (assert_type (3.5 * i3 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
112
+ check (assert_type (i0 * md1 , "pd.Interval[int]" ), pd .Interval )
113
+ check (assert_type (md1 * i0 , "pd.Interval[int]" ), pd .Interval )
94
114
95
- check (assert_type (i0 / 3 , "pd.Interval[int]" ), pd .Interval )
96
- check (assert_type (i1 / 3 , "pd.Interval[float]" ), pd .Interval )
97
- check (assert_type (i3 / 3 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
115
+ check (assert_type (i1 * md1 , "pd.Interval[float]" ), pd .Interval )
116
+ check (assert_type (md1 * i1 , "pd.Interval[float]" ), pd .Interval )
98
117
99
- check (assert_type (i0 / 3.5 , "pd.Interval[float]" ), pd .Interval )
100
- check (assert_type (i1 / 3.5 , "pd.Interval[float]" ), pd .Interval )
101
- check (assert_type (i3 / 3.5 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
118
+ check (assert_type (i3 * md1 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
119
+ check (assert_type (md1 * i3 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
102
120
103
- check (assert_type (i0 // 3 , "pd.Interval[int]" ), pd .Interval )
104
- check (assert_type (i1 // 3 , "pd.Interval[float]" ), pd .Interval )
105
- check (assert_type (i3 // 3 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
121
+ check (assert_type (i0 * md2 , "pd.Interval[float]" ), pd .Interval )
122
+ check (assert_type (md2 * i0 , "pd.Interval[float]" ), pd .Interval )
106
123
107
- check (assert_type (i0 // 3.5 , "pd.Interval[float]" ), pd .Interval )
108
- check (assert_type (i1 // 3.5 , "pd.Interval[float]" ), pd .Interval )
109
- check (assert_type (i3 // 3.5 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
124
+ check (assert_type (i1 * md2 , "pd.Interval[float]" ), pd .Interval )
125
+ check (assert_type (md2 * i1 , "pd.Interval[float]" ), pd .Interval )
110
126
111
- check (assert_type (i0 - 1 , "pd.Interval[int]" ), pd .Interval )
112
- check (assert_type (i1 - 1 , "pd.Interval[float]" ), pd .Interval )
113
- check (
114
- assert_type (i2 - pd .Timedelta (days = 1 ), "pd.Interval[pd.Timestamp]" ), pd .Interval
115
- )
116
- check (
117
- assert_type (i3 - pd .Timedelta (days = 1 ), "pd.Interval[pd.Timedelta]" ), pd .Interval
118
- )
127
+ check (assert_type (i3 * md2 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
128
+ check (assert_type (md2 * i3 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
119
129
120
- check (assert_type (i0 - 1.5 , "pd.Interval[float]" ), pd .Interval )
121
- check (assert_type (i1 - 1.5 , "pd.Interval[float]" ), pd .Interval )
122
- check (
123
- assert_type (i2 - pd .Timedelta (days = 1 ), "pd.Interval[pd.Timestamp]" ), pd .Interval
124
- )
125
- check (
126
- assert_type (i3 - pd .Timedelta (days = 1 ), "pd.Interval[pd.Timedelta]" ), pd .Interval
127
- )
130
+ check (assert_type (i0 / md1 , "pd.Interval[int]" ), pd .Interval )
131
+ check (assert_type (i1 / md1 , "pd.Interval[float]" ), pd .Interval )
132
+ check (assert_type (i3 / md1 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
128
133
129
- check (assert_type (i0 + 1 , "pd.Interval[int]" ), pd .Interval )
130
- check (assert_type (i1 + 1 , "pd.Interval[float]" ), pd .Interval )
131
- check (
132
- assert_type (i2 + pd .Timedelta (days = 1 ), "pd.Interval[pd.Timestamp]" ), pd .Interval
133
- )
134
- check (
135
- assert_type (i3 + pd .Timedelta (days = 1 ), "pd.Interval[pd.Timedelta]" ), pd .Interval
136
- )
134
+ check (assert_type (i0 / md2 , "pd.Interval[float]" ), pd .Interval )
135
+ check (assert_type (i1 / md2 , "pd.Interval[float]" ), pd .Interval )
136
+ check (assert_type (i3 / md2 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
137
137
138
- check (assert_type (i0 + 1.5 , "pd.Interval[float]" ), pd .Interval )
139
- check (assert_type (i1 + 1.5 , "pd.Interval[float]" ), pd .Interval )
140
- check (
141
- assert_type (i2 + pd .Timedelta (days = 1 ), "pd.Interval[pd.Timestamp]" ), pd .Interval
142
- )
143
- check (
144
- assert_type (i3 + pd .Timedelta (days = 1 ), "pd.Interval[pd.Timedelta]" ), pd .Interval
138
+ check (assert_type (i0 // md1 , "pd.Interval[int]" ), pd .Interval )
139
+ check (assert_type (i1 // md1 , "pd.Interval[float]" ), pd .Interval )
140
+ check (assert_type (i3 // md1 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
141
+
142
+ check (assert_type (i0 // md2 , "pd.Interval[float]" ), pd .Interval )
143
+ check (assert_type (i1 // md2 , "pd.Interval[float]" ), pd .Interval )
144
+ check (assert_type (i3 // md2 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
145
+
146
+ if TYPE_CHECKING_INVALID_USAGE :
147
+ md1 / i0 # type: ignore[operator]
148
+ md1 / i1 # type: ignore[operator]
149
+ md1 / i3 # type: ignore[operator]
150
+
151
+ md2 / i0 # type: ignore[operator]
152
+ md2 / i1 # type: ignore[operator]
153
+ md2 / i3 # type: ignore[operator]
154
+
155
+ md1 // i0 # type: ignore[operator]
156
+ md1 // i1 # type: ignore[operator]
157
+ md1 // i3 # type: ignore[operator]
158
+
159
+ md2 // i0 # type: ignore[operator]
160
+ md2 // i1 # type: ignore[operator]
161
+ md2 // i3 # type: ignore[operator]
162
+
163
+ as1 = 1
164
+ as2 = pd .Timedelta (days = 1 )
165
+ as3 = 1.5
166
+
167
+ check (assert_type (i0 - as1 , "pd.Interval[int]" ), pd .Interval )
168
+
169
+ check (assert_type (i0 - as3 , "pd.Interval[float]" ), pd .Interval )
170
+
171
+ check (assert_type (i0 + as1 , "pd.Interval[int]" ), pd .Interval )
172
+ check (assert_type (as1 + i0 , "pd.Interval[int]" ), pd .Interval )
173
+
174
+ check (assert_type (i0 + as3 , "pd.Interval[float]" ), pd .Interval )
175
+ check (assert_type (as3 + i0 , "pd.Interval[float]" ), pd .Interval )
176
+
177
+ check (assert_type (i1 - as1 , "pd.Interval[float]" ), pd .Interval )
178
+
179
+ check (assert_type (i1 - as3 , "pd.Interval[float]" ), pd .Interval )
180
+
181
+ check (assert_type (i1 + as1 , "pd.Interval[float]" ), pd .Interval )
182
+ check (assert_type (as1 + i1 , "pd.Interval[float]" ), pd .Interval )
183
+
184
+ check (assert_type (i1 + as3 , "pd.Interval[float]" ), pd .Interval )
185
+ check (assert_type (as3 + i1 , "pd.Interval[float]" ), pd .Interval )
186
+
187
+ check (assert_type (i2 - as2 , "pd.Interval[pd.Timestamp]" ), pd .Interval )
188
+
189
+ check (assert_type (i2 + as2 , "pd.Interval[pd.Timestamp]" ), pd .Interval )
190
+ check (assert_type (as2 + i2 , "pd.Interval[pd.Timestamp]" ), pd .Interval )
191
+
192
+ check (assert_type (i3 - as2 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
193
+
194
+ check (assert_type (i3 + as2 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
195
+ check (assert_type (as2 + i3 , "pd.Interval[pd.Timedelta]" ), pd .Interval )
196
+
197
+ if TYPE_CHECKING_INVALID_USAGE :
198
+ as1 - i0 # type: ignore[operator]
199
+ as3 - i0 # type: ignore[operator]
200
+ as1 - i1 # type: ignore[operator]
201
+ as3 - i1 # type: ignore[operator]
202
+ as2 - i2 # type: ignore[operator]
203
+ as2 - i3 # type: ignore[operator]
204
+
205
+
206
+ def test_interval_misc () -> None :
207
+ i0 = pd .Interval (0 , 1 , closed = "left" )
208
+ i1 = pd .Interval (0.0 , 1.0 , closed = "right" )
209
+ i2 = pd .Interval (
210
+ pd .Timestamp ("2017-01-01" ), pd .Timestamp ("2017-01-02" ), closed = "both"
145
211
)
212
+ i3 = pd .Interval (pd .Timedelta ("1 days" ), pd .Timedelta ("2 days" ), closed = "neither" )
146
213
147
214
check (assert_type (0.5 in i0 , bool ), bool )
148
215
check (assert_type (1 in i0 , bool ), bool )
0 commit comments