forked from pandas-dev/pandas
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtest_insert.py
107 lines (87 loc) · 3.53 KB
/
test_insert.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
from datetime import timedelta
import numpy as np
import pytest
import pandas as pd
from pandas import Index, Timedelta, TimedeltaIndex, timedelta_range
import pandas._testing as tm
class TestTimedeltaIndexInsert:
def test_insert(self):
idx = TimedeltaIndex(["4day", "1day", "2day"], name="idx")
result = idx.insert(2, timedelta(days=5))
exp = TimedeltaIndex(["4day", "1day", "5day", "2day"], name="idx")
tm.assert_index_equal(result, exp)
# insertion of non-datetime should coerce to object index
result = idx.insert(1, "inserted")
expected = Index(
[Timedelta("4day"), "inserted", Timedelta("1day"), Timedelta("2day")],
name="idx",
)
assert not isinstance(result, TimedeltaIndex)
tm.assert_index_equal(result, expected)
assert result.name == expected.name
idx = timedelta_range("1day 00:00:01", periods=3, freq="s", name="idx")
# preserve freq
expected_0 = TimedeltaIndex(
["1day", "1day 00:00:01", "1day 00:00:02", "1day 00:00:03"],
name="idx",
freq="s",
)
expected_3 = TimedeltaIndex(
["1day 00:00:01", "1day 00:00:02", "1day 00:00:03", "1day 00:00:04"],
name="idx",
freq="s",
)
# reset freq to None
expected_1_nofreq = TimedeltaIndex(
["1day 00:00:01", "1day 00:00:01", "1day 00:00:02", "1day 00:00:03"],
name="idx",
freq=None,
)
expected_3_nofreq = TimedeltaIndex(
["1day 00:00:01", "1day 00:00:02", "1day 00:00:03", "1day 00:00:05"],
name="idx",
freq=None,
)
cases = [
(0, Timedelta("1day"), expected_0),
(-3, Timedelta("1day"), expected_0),
(3, Timedelta("1day 00:00:04"), expected_3),
(1, Timedelta("1day 00:00:01"), expected_1_nofreq),
(3, Timedelta("1day 00:00:05"), expected_3_nofreq),
]
for n, d, expected in cases:
result = idx.insert(n, d)
tm.assert_index_equal(result, expected)
assert result.name == expected.name
assert result.freq == expected.freq
@pytest.mark.parametrize(
"null", [None, np.nan, np.timedelta64("NaT"), pd.NaT, pd.NA]
)
def test_insert_nat(self, null):
# GH 18295 (test missing)
idx = timedelta_range("1day", "3day")
result = idx.insert(1, null)
expected = TimedeltaIndex(["1day", pd.NaT, "2day", "3day"])
tm.assert_index_equal(result, expected)
def test_insert_invalid_na(self):
idx = TimedeltaIndex(["4day", "1day", "2day"], name="idx")
with pytest.raises(TypeError, match="incompatible label"):
idx.insert(0, np.datetime64("NaT"))
def test_insert_dont_cast_strings(self):
# To match DatetimeIndex and PeriodIndex behavior, dont try to
# parse strings to Timedelta
idx = timedelta_range("1day", "3day")
result = idx.insert(0, "1 Day")
assert result.dtype == object
assert result[0] == "1 Day"
def test_insert_empty(self):
# Corner case inserting with length zero doesnt raise IndexError
# GH#33573 for freq preservation
idx = timedelta_range("1 Day", periods=3)
td = idx[0]
result = idx[:0].insert(0, td)
assert result.freq == "D"
result = idx[:0].insert(1, td)
assert result.freq == "D"
result = idx[:0].insert(-1, td)
assert result.freq == "D"