@@ -94,6 +94,174 @@ def test_compare_timedelta_ndarray(self):
94
94
95
95
class TestTimedeltas (object ):
96
96
97
+ def setup_method (self , method ):
98
+ pass
99
+
100
+ def test_construction (self ):
101
+
102
+ expected = np .timedelta64 (10 , 'D' ).astype ('m8[ns]' ).view ('i8' )
103
+ assert Timedelta (10 , unit = 'd' ).value == expected
104
+ assert Timedelta (10.0 , unit = 'd' ).value == expected
105
+ assert Timedelta ('10 days' ).value == expected
106
+ assert Timedelta (days = 10 ).value == expected
107
+ assert Timedelta (days = 10.0 ).value == expected
108
+
109
+ expected += np .timedelta64 (10 , 's' ).astype ('m8[ns]' ).view ('i8' )
110
+ assert Timedelta ('10 days 00:00:10' ).value == expected
111
+ assert Timedelta (days = 10 , seconds = 10 ).value == expected
112
+ assert Timedelta (days = 10 , milliseconds = 10 * 1000 ).value == expected
113
+ assert (Timedelta (days = 10 , microseconds = 10 * 1000 * 1000 )
114
+ .value == expected )
115
+
116
+ # gh-8757: test construction with np dtypes
117
+ timedelta_kwargs = {'days' : 'D' ,
118
+ 'seconds' : 's' ,
119
+ 'microseconds' : 'us' ,
120
+ 'milliseconds' : 'ms' ,
121
+ 'minutes' : 'm' ,
122
+ 'hours' : 'h' ,
123
+ 'weeks' : 'W' }
124
+ npdtypes = [np .int64 , np .int32 , np .int16 , np .float64 , np .float32 ,
125
+ np .float16 ]
126
+ for npdtype in npdtypes :
127
+ for pykwarg , npkwarg in timedelta_kwargs .items ():
128
+ expected = np .timedelta64 (1 , npkwarg ).astype (
129
+ 'm8[ns]' ).view ('i8' )
130
+ assert Timedelta (** {pykwarg : npdtype (1 )}).value == expected
131
+
132
+ # rounding cases
133
+ assert Timedelta (82739999850000 ).value == 82739999850000
134
+ assert ('0 days 22:58:59.999850' in str (Timedelta (82739999850000 )))
135
+ assert Timedelta (123072001000000 ).value == 123072001000000
136
+ assert ('1 days 10:11:12.001' in str (Timedelta (123072001000000 )))
137
+
138
+ # string conversion with/without leading zero
139
+ # GH 9570
140
+ assert Timedelta ('0:00:00' ) == timedelta (hours = 0 )
141
+ assert Timedelta ('00:00:00' ) == timedelta (hours = 0 )
142
+ assert Timedelta ('-1:00:00' ) == - timedelta (hours = 1 )
143
+ assert Timedelta ('-01:00:00' ) == - timedelta (hours = 1 )
144
+
145
+ # more strings & abbrevs
146
+ # GH 8190
147
+ assert Timedelta ('1 h' ) == timedelta (hours = 1 )
148
+ assert Timedelta ('1 hour' ) == timedelta (hours = 1 )
149
+ assert Timedelta ('1 hr' ) == timedelta (hours = 1 )
150
+ assert Timedelta ('1 hours' ) == timedelta (hours = 1 )
151
+ assert Timedelta ('-1 hours' ) == - timedelta (hours = 1 )
152
+ assert Timedelta ('1 m' ) == timedelta (minutes = 1 )
153
+ assert Timedelta ('1.5 m' ) == timedelta (seconds = 90 )
154
+ assert Timedelta ('1 minute' ) == timedelta (minutes = 1 )
155
+ assert Timedelta ('1 minutes' ) == timedelta (minutes = 1 )
156
+ assert Timedelta ('1 s' ) == timedelta (seconds = 1 )
157
+ assert Timedelta ('1 second' ) == timedelta (seconds = 1 )
158
+ assert Timedelta ('1 seconds' ) == timedelta (seconds = 1 )
159
+ assert Timedelta ('1 ms' ) == timedelta (milliseconds = 1 )
160
+ assert Timedelta ('1 milli' ) == timedelta (milliseconds = 1 )
161
+ assert Timedelta ('1 millisecond' ) == timedelta (milliseconds = 1 )
162
+ assert Timedelta ('1 us' ) == timedelta (microseconds = 1 )
163
+ assert Timedelta ('1 micros' ) == timedelta (microseconds = 1 )
164
+ assert Timedelta ('1 microsecond' ) == timedelta (microseconds = 1 )
165
+ assert Timedelta ('1.5 microsecond' ) == Timedelta ('00:00:00.000001500' )
166
+ assert Timedelta ('1 ns' ) == Timedelta ('00:00:00.000000001' )
167
+ assert Timedelta ('1 nano' ) == Timedelta ('00:00:00.000000001' )
168
+ assert Timedelta ('1 nanosecond' ) == Timedelta ('00:00:00.000000001' )
169
+
170
+ # combos
171
+ assert Timedelta ('10 days 1 hour' ) == timedelta (days = 10 , hours = 1 )
172
+ assert Timedelta ('10 days 1 h' ) == timedelta (days = 10 , hours = 1 )
173
+ assert Timedelta ('10 days 1 h 1m 1s' ) == timedelta (
174
+ days = 10 , hours = 1 , minutes = 1 , seconds = 1 )
175
+ assert Timedelta ('-10 days 1 h 1m 1s' ) == - timedelta (
176
+ days = 10 , hours = 1 , minutes = 1 , seconds = 1 )
177
+ assert Timedelta ('-10 days 1 h 1m 1s' ) == - timedelta (
178
+ days = 10 , hours = 1 , minutes = 1 , seconds = 1 )
179
+ assert Timedelta ('-10 days 1 h 1m 1s 3us' ) == - timedelta (
180
+ days = 10 , hours = 1 , minutes = 1 , seconds = 1 , microseconds = 3 )
181
+ assert Timedelta ('-10 days 1 h 1.5m 1s 3us' ), - timedelta (
182
+ days = 10 , hours = 1 , minutes = 1 , seconds = 31 , microseconds = 3 )
183
+
184
+ # Currently invalid as it has a - on the hh:mm:dd part
185
+ # (only allowed on the days)
186
+ pytest .raises (ValueError ,
187
+ lambda : Timedelta ('-10 days -1 h 1.5m 1s 3us' ))
188
+
189
+ # only leading neg signs are allowed
190
+ pytest .raises (ValueError ,
191
+ lambda : Timedelta ('10 days -1 h 1.5m 1s 3us' ))
192
+
193
+ # no units specified
194
+ pytest .raises (ValueError , lambda : Timedelta ('3.1415' ))
195
+
196
+ # invalid construction
197
+ tm .assert_raises_regex (ValueError , "cannot construct a Timedelta" ,
198
+ lambda : Timedelta ())
199
+ tm .assert_raises_regex (ValueError ,
200
+ "unit abbreviation w/o a number" ,
201
+ lambda : Timedelta ('foo' ))
202
+ tm .assert_raises_regex (ValueError ,
203
+ "cannot construct a Timedelta from the "
204
+ "passed arguments, allowed keywords are " ,
205
+ lambda : Timedelta (day = 10 ))
206
+
207
+ # round-trip both for string and value
208
+ for v in ['1s' , '-1s' , '1us' , '-1us' , '1 day' , '-1 day' ,
209
+ '-23:59:59.999999' , '-1 days +23:59:59.999999' , '-1ns' ,
210
+ '1ns' , '-23:59:59.999999999' ]:
211
+
212
+ td = Timedelta (v )
213
+ assert Timedelta (td .value ) == td
214
+
215
+ # str does not normally display nanos
216
+ if not td .nanoseconds :
217
+ assert Timedelta (str (td )) == td
218
+ assert Timedelta (td ._repr_base (format = 'all' )) == td
219
+
220
+ # floats
221
+ expected = np .timedelta64 (
222
+ 10 , 's' ).astype ('m8[ns]' ).view ('i8' ) + np .timedelta64 (
223
+ 500 , 'ms' ).astype ('m8[ns]' ).view ('i8' )
224
+ assert Timedelta (10.5 , unit = 's' ).value == expected
225
+
226
+ # offset
227
+ assert (to_timedelta (pd .offsets .Hour (2 )) ==
228
+ Timedelta ('0 days, 02:00:00' ))
229
+ assert (Timedelta (pd .offsets .Hour (2 )) ==
230
+ Timedelta ('0 days, 02:00:00' ))
231
+ assert (Timedelta (pd .offsets .Second (2 )) ==
232
+ Timedelta ('0 days, 00:00:02' ))
233
+
234
+ # gh-11995: unicode
235
+ expected = Timedelta ('1H' )
236
+ result = pd .Timedelta (u'1H' )
237
+ assert result == expected
238
+ assert (to_timedelta (pd .offsets .Hour (2 )) ==
239
+ Timedelta (u'0 days, 02:00:00' ))
240
+
241
+ pytest .raises (ValueError , lambda : Timedelta (u'foo bar' ))
242
+
243
+ @pytest .mark .parametrize ("unit, value, expected" , [
244
+ ('us' , 9.999 , 9999 ), ('ms' , 9.999999 , 9999999 ),
245
+ ('s' , 9.999999999 , 9999999999 )])
246
+ def test_rounding_on_int_unit_construction (self , unit , value , expected ):
247
+ # GH 12690
248
+ result = Timedelta (value , unit = unit )
249
+ assert result .value == expected
250
+ result = Timedelta (str (value ) + unit )
251
+ assert result .value == expected
252
+
253
+ def test_overflow_on_construction (self ):
254
+ # xref https://github.com/statsmodels/statsmodels/issues/3374
255
+ value = pd .Timedelta ('1day' ).value * 20169940
256
+ pytest .raises (OverflowError , pd .Timedelta , value )
257
+
258
+ # xref gh-17637
259
+ with pytest .raises (OverflowError ):
260
+ pd .Timedelta (7 * 19999 , unit = 'D' )
261
+
262
+ with pytest .raises (OverflowError ):
263
+ pd .Timedelta (timedelta (days = 13 * 19999 ))
264
+
97
265
def test_total_seconds_scalar (self ):
98
266
# see gh-10939
99
267
rng = Timedelta ('1 days, 10:11:12.100123456' )
0 commit comments