@@ -94,6 +94,174 @@ def test_compare_timedelta_ndarray(self):
9494
9595class TestTimedeltas (object ):
9696
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+
97265 def test_total_seconds_scalar (self ):
98266 # see gh-10939
99267 rng = Timedelta ('1 days, 10:11:12.100123456' )
0 commit comments