Skip to content

Commit 1cf0c3a

Browse files
jbrockmendeljreback
authored andcommitted
Split+Parametrize Timedelta tests (#19736)
1 parent c05f3c1 commit 1cf0c3a

File tree

3 files changed

+270
-254
lines changed

3 files changed

+270
-254
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
# -*- coding: utf-8 -*-
2+
from datetime import timedelta
3+
4+
import pytest
5+
import numpy as np
6+
7+
import pandas as pd
8+
import pandas.util.testing as tm
9+
from pandas import Timedelta
10+
11+
12+
def test_construction():
13+
expected = np.timedelta64(10, 'D').astype('m8[ns]').view('i8')
14+
assert Timedelta(10, unit='d').value == expected
15+
assert Timedelta(10.0, unit='d').value == expected
16+
assert Timedelta('10 days').value == expected
17+
assert Timedelta(days=10).value == expected
18+
assert Timedelta(days=10.0).value == expected
19+
20+
expected += np.timedelta64(10, 's').astype('m8[ns]').view('i8')
21+
assert Timedelta('10 days 00:00:10').value == expected
22+
assert Timedelta(days=10, seconds=10).value == expected
23+
assert Timedelta(days=10, milliseconds=10 * 1000).value == expected
24+
assert Timedelta(days=10,
25+
microseconds=10 * 1000 * 1000).value == expected
26+
27+
# rounding cases
28+
assert Timedelta(82739999850000).value == 82739999850000
29+
assert ('0 days 22:58:59.999850' in str(Timedelta(82739999850000)))
30+
assert Timedelta(123072001000000).value == 123072001000000
31+
assert ('1 days 10:11:12.001' in str(Timedelta(123072001000000)))
32+
33+
# string conversion with/without leading zero
34+
# GH#9570
35+
assert Timedelta('0:00:00') == timedelta(hours=0)
36+
assert Timedelta('00:00:00') == timedelta(hours=0)
37+
assert Timedelta('-1:00:00') == -timedelta(hours=1)
38+
assert Timedelta('-01:00:00') == -timedelta(hours=1)
39+
40+
# more strings & abbrevs
41+
# GH#8190
42+
assert Timedelta('1 h') == timedelta(hours=1)
43+
assert Timedelta('1 hour') == timedelta(hours=1)
44+
assert Timedelta('1 hr') == timedelta(hours=1)
45+
assert Timedelta('1 hours') == timedelta(hours=1)
46+
assert Timedelta('-1 hours') == -timedelta(hours=1)
47+
assert Timedelta('1 m') == timedelta(minutes=1)
48+
assert Timedelta('1.5 m') == timedelta(seconds=90)
49+
assert Timedelta('1 minute') == timedelta(minutes=1)
50+
assert Timedelta('1 minutes') == timedelta(minutes=1)
51+
assert Timedelta('1 s') == timedelta(seconds=1)
52+
assert Timedelta('1 second') == timedelta(seconds=1)
53+
assert Timedelta('1 seconds') == timedelta(seconds=1)
54+
assert Timedelta('1 ms') == timedelta(milliseconds=1)
55+
assert Timedelta('1 milli') == timedelta(milliseconds=1)
56+
assert Timedelta('1 millisecond') == timedelta(milliseconds=1)
57+
assert Timedelta('1 us') == timedelta(microseconds=1)
58+
assert Timedelta('1 micros') == timedelta(microseconds=1)
59+
assert Timedelta('1 microsecond') == timedelta(microseconds=1)
60+
assert Timedelta('1.5 microsecond') == Timedelta('00:00:00.000001500')
61+
assert Timedelta('1 ns') == Timedelta('00:00:00.000000001')
62+
assert Timedelta('1 nano') == Timedelta('00:00:00.000000001')
63+
assert Timedelta('1 nanosecond') == Timedelta('00:00:00.000000001')
64+
65+
# combos
66+
assert Timedelta('10 days 1 hour') == timedelta(days=10, hours=1)
67+
assert Timedelta('10 days 1 h') == timedelta(days=10, hours=1)
68+
assert Timedelta('10 days 1 h 1m 1s') == timedelta(
69+
days=10, hours=1, minutes=1, seconds=1)
70+
assert Timedelta('-10 days 1 h 1m 1s') == -timedelta(
71+
days=10, hours=1, minutes=1, seconds=1)
72+
assert Timedelta('-10 days 1 h 1m 1s') == -timedelta(
73+
days=10, hours=1, minutes=1, seconds=1)
74+
assert Timedelta('-10 days 1 h 1m 1s 3us') == -timedelta(
75+
days=10, hours=1, minutes=1, seconds=1, microseconds=3)
76+
assert Timedelta('-10 days 1 h 1.5m 1s 3us') == -timedelta(
77+
days=10, hours=1, minutes=1, seconds=31, microseconds=3)
78+
79+
# Currently invalid as it has a - on the hh:mm:dd part
80+
# (only allowed on the days)
81+
with pytest.raises(ValueError):
82+
Timedelta('-10 days -1 h 1.5m 1s 3us')
83+
84+
# only leading neg signs are allowed
85+
with pytest.raises(ValueError):
86+
Timedelta('10 days -1 h 1.5m 1s 3us')
87+
88+
# no units specified
89+
with pytest.raises(ValueError):
90+
Timedelta('3.1415')
91+
92+
# invalid construction
93+
tm.assert_raises_regex(ValueError, "cannot construct a Timedelta",
94+
lambda: Timedelta())
95+
tm.assert_raises_regex(ValueError,
96+
"unit abbreviation w/o a number",
97+
lambda: Timedelta('foo'))
98+
tm.assert_raises_regex(ValueError,
99+
"cannot construct a Timedelta from the "
100+
"passed arguments, allowed keywords are ",
101+
lambda: Timedelta(day=10))
102+
103+
# floats
104+
expected = np.timedelta64(
105+
10, 's').astype('m8[ns]').view('i8') + np.timedelta64(
106+
500, 'ms').astype('m8[ns]').view('i8')
107+
assert Timedelta(10.5, unit='s').value == expected
108+
109+
# offset
110+
assert pd.to_timedelta(pd.offsets.Hour(2)) == Timedelta(hours=2)
111+
assert Timedelta(pd.offsets.Hour(2)) == Timedelta(hours=2)
112+
assert Timedelta(pd.offsets.Second(2)) == Timedelta(seconds=2)
113+
114+
# GH#11995: unicode
115+
expected = Timedelta('1H')
116+
result = pd.Timedelta(u'1H')
117+
assert result == expected
118+
assert (pd.to_timedelta(pd.offsets.Hour(2)) ==
119+
Timedelta(u'0 days, 02:00:00'))
120+
121+
with pytest.raises(ValueError):
122+
Timedelta(u'foo bar')
123+
124+
125+
@pytest.mark.parametrize('item', list({'days': 'D',
126+
'seconds': 's',
127+
'microseconds': 'us',
128+
'milliseconds': 'ms',
129+
'minutes': 'm',
130+
'hours': 'h',
131+
'weeks': 'W'}.items()))
132+
@pytest.mark.parametrize('npdtype', [np.int64, np.int32, np.int16,
133+
np.float64, np.float32, np.float16])
134+
def test_td_construction_with_np_dtypes(npdtype, item):
135+
# GH#8757: test construction with np dtypes
136+
pykwarg, npkwarg = item
137+
expected = np.timedelta64(1, npkwarg).astype('m8[ns]').view('i8')
138+
assert Timedelta(**{pykwarg: npdtype(1)}).value == expected
139+
140+
141+
@pytest.mark.parametrize('val', [
142+
'1s', '-1s', '1us', '-1us', '1 day', '-1 day',
143+
'-23:59:59.999999', '-1 days +23:59:59.999999', '-1ns',
144+
'1ns', '-23:59:59.999999999'])
145+
def test_td_from_repr_roundtrip(val):
146+
# round-trip both for string and value
147+
td = Timedelta(val)
148+
assert Timedelta(td.value) == td
149+
150+
# str does not normally display nanos
151+
if not td.nanoseconds:
152+
assert Timedelta(str(td)) == td
153+
assert Timedelta(td._repr_base(format='all')) == td
154+
155+
156+
def test_overflow_on_construction():
157+
# xref https://github.com/statsmodels/statsmodels/issues/3374
158+
value = pd.Timedelta('1day').value * 20169940
159+
with pytest.raises(OverflowError):
160+
pd.Timedelta(value)
161+
162+
# xref GH#17637
163+
with pytest.raises(OverflowError):
164+
pd.Timedelta(7 * 19999, unit='D')
165+
166+
with pytest.raises(OverflowError):
167+
pd.Timedelta(timedelta(days=13 * 19999))
168+
169+
170+
@pytest.mark.parametrize('fmt,exp', [
171+
('P6DT0H50M3.010010012S', Timedelta(days=6, minutes=50, seconds=3,
172+
milliseconds=10, microseconds=10,
173+
nanoseconds=12)),
174+
('P-6DT0H50M3.010010012S', Timedelta(days=-6, minutes=50, seconds=3,
175+
milliseconds=10, microseconds=10,
176+
nanoseconds=12)),
177+
('P4DT12H30M5S', Timedelta(days=4, hours=12, minutes=30, seconds=5)),
178+
('P0DT0H0M0.000000123S', Timedelta(nanoseconds=123)),
179+
('P0DT0H0M0.00001S', Timedelta(microseconds=10)),
180+
('P0DT0H0M0.001S', Timedelta(milliseconds=1)),
181+
('P0DT0H1M0S', Timedelta(minutes=1)),
182+
('P1DT25H61M61S', Timedelta(days=1, hours=25, minutes=61, seconds=61))
183+
])
184+
def test_iso_constructor(fmt, exp):
185+
assert Timedelta(fmt) == exp
186+
187+
188+
@pytest.mark.parametrize('fmt', [
189+
'PPPPPPPPPPPP', 'PDTHMS', 'P0DT999H999M999S',
190+
'P1DT0H0M0.0000000000000S', 'P1DT0H0M00000000000S',
191+
'P1DT0H0M0.S'])
192+
def test_iso_constructor_raises(fmt):
193+
with tm.assert_raises_regex(ValueError, 'Invalid ISO 8601 Duration '
194+
'format - {}'.format(fmt)):
195+
Timedelta(fmt)
196+
197+
198+
def test_td_constructor_on_nanoseconds():
199+
# GH#9273
200+
result = Timedelta(nanoseconds=100)
201+
expected = Timedelta('100ns')
202+
assert result == expected
203+
204+
result = Timedelta(days=1, hours=1, minutes=1, weeks=1, seconds=1,
205+
milliseconds=1, microseconds=1, nanoseconds=1)
206+
expected = Timedelta(694861001001001)
207+
assert result == expected
208+
209+
result = Timedelta(microseconds=1) + Timedelta(nanoseconds=1)
210+
expected = Timedelta('1us1ns')
211+
assert result == expected
212+
213+
result = Timedelta(microseconds=1) - Timedelta(nanoseconds=1)
214+
expected = Timedelta('999ns')
215+
assert result == expected
216+
217+
result = Timedelta(microseconds=1) + 5 * Timedelta(nanoseconds=-2)
218+
expected = Timedelta('990ns')
219+
assert result == expected
220+
221+
with pytest.raises(TypeError):
222+
Timedelta(nanoseconds='abc')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# -*- coding: utf-8 -*-
2+
from pandas import Timedelta
3+
4+
5+
def test_repr():
6+
assert (repr(Timedelta(10, unit='d')) ==
7+
"Timedelta('10 days 00:00:00')")
8+
assert (repr(Timedelta(10, unit='s')) ==
9+
"Timedelta('0 days 00:00:10')")
10+
assert (repr(Timedelta(10, unit='ms')) ==
11+
"Timedelta('0 days 00:00:00.010000')")
12+
assert (repr(Timedelta(-10, unit='ms')) ==
13+
"Timedelta('-1 days +23:59:59.990000')")
14+
15+
16+
def test_isoformat():
17+
td = Timedelta(days=6, minutes=50, seconds=3,
18+
milliseconds=10, microseconds=10, nanoseconds=12)
19+
expected = 'P6DT0H50M3.010010012S'
20+
result = td.isoformat()
21+
assert result == expected
22+
23+
td = Timedelta(days=4, hours=12, minutes=30, seconds=5)
24+
result = td.isoformat()
25+
expected = 'P4DT12H30M5S'
26+
assert result == expected
27+
28+
td = Timedelta(nanoseconds=123)
29+
result = td.isoformat()
30+
expected = 'P0DT0H0M0.000000123S'
31+
assert result == expected
32+
33+
# trim nano
34+
td = Timedelta(microseconds=10)
35+
result = td.isoformat()
36+
expected = 'P0DT0H0M0.00001S'
37+
assert result == expected
38+
39+
# trim micro
40+
td = Timedelta(milliseconds=1)
41+
result = td.isoformat()
42+
expected = 'P0DT0H0M0.001S'
43+
assert result == expected
44+
45+
# don't strip every 0
46+
result = Timedelta(minutes=1).isoformat()
47+
expected = 'P0DT0H1M0S'
48+
assert result == expected

0 commit comments

Comments
 (0)