|
1 | 1 | import numpy as np
|
| 2 | +import pytest |
2 | 3 |
|
3 | 4 | import pandas as pd
|
4 | 5 | from pandas import Int64Index, TimedeltaIndex, timedelta_range
|
5 | 6 | import pandas.util.testing as tm
|
6 | 7 |
|
| 8 | +from pandas.tseries.offsets import Hour |
| 9 | + |
7 | 10 |
|
8 | 11 | class TestTimedeltaIndex:
|
9 | 12 |
|
@@ -73,3 +76,94 @@ def test_intersection_bug_1708(self):
|
73 | 76 | result = index_1 & index_2
|
74 | 77 | expected = timedelta_range('1 day 01:00:00', periods=3, freq='h')
|
75 | 78 | tm.assert_index_equal(result, expected)
|
| 79 | + |
| 80 | + @pytest.mark.parametrize("sort", [None, False]) |
| 81 | + def test_intersection_equal(self, sort): |
| 82 | + # GH 24471 Test intersection outcome given the sort keyword |
| 83 | + # for equal indicies intersection should return the original index |
| 84 | + first = timedelta_range('1 day', periods=4, freq='h') |
| 85 | + second = timedelta_range('1 day', periods=4, freq='h') |
| 86 | + intersect = first.intersection(second, sort=sort) |
| 87 | + if sort is None: |
| 88 | + tm.assert_index_equal(intersect, second.sort_values()) |
| 89 | + assert tm.equalContents(intersect, second) |
| 90 | + |
| 91 | + # Corner cases |
| 92 | + inter = first.intersection(first, sort=sort) |
| 93 | + assert inter is first |
| 94 | + |
| 95 | + @pytest.mark.parametrize("period_1, period_2", [(0, 4), (4, 0)]) |
| 96 | + @pytest.mark.parametrize("sort", [None, False]) |
| 97 | + def test_intersection_zero_length(self, period_1, period_2, sort): |
| 98 | + # GH 24471 test for non overlap the intersection should be zero length |
| 99 | + index_1 = timedelta_range('1 day', periods=period_1, freq='h') |
| 100 | + index_2 = timedelta_range('1 day', periods=period_2, freq='h') |
| 101 | + expected = timedelta_range('1 day', periods=0, freq='h') |
| 102 | + result = index_1.intersection(index_2, sort=sort) |
| 103 | + tm.assert_index_equal(result, expected) |
| 104 | + |
| 105 | + @pytest.mark.parametrize('sort', [None, False]) |
| 106 | + def test_zero_length_input_index(self, sort): |
| 107 | + # GH 24966 test for 0-len intersections are copied |
| 108 | + index_1 = timedelta_range('1 day', periods=0, freq='h') |
| 109 | + index_2 = timedelta_range('1 day', periods=3, freq='h') |
| 110 | + result = index_1.intersection(index_2, sort=sort) |
| 111 | + assert index_1 is not result |
| 112 | + assert index_2 is not result |
| 113 | + tm.assert_copy(result, index_1) |
| 114 | + |
| 115 | + @pytest.mark.parametrize( |
| 116 | + "rng, expected", |
| 117 | + # if target has the same name, it is preserved |
| 118 | + [ |
| 119 | + (timedelta_range('1 day', periods=5, freq='h', name='idx'), |
| 120 | + timedelta_range('1 day', periods=4, freq='h', name='idx')), |
| 121 | + # if target name is different, it will be reset |
| 122 | + (timedelta_range('1 day', periods=5, freq='h', name='other'), |
| 123 | + timedelta_range('1 day', periods=4, freq='h', name=None)), |
| 124 | + # if no overlap exists return empty index |
| 125 | + (timedelta_range('1 day', periods=10, freq='h', name='idx')[5:], |
| 126 | + TimedeltaIndex([], name='idx'))]) |
| 127 | + @pytest.mark.parametrize("sort", [None, False]) |
| 128 | + def test_intersection(self, rng, expected, sort): |
| 129 | + # GH 4690 (with tz) |
| 130 | + base = timedelta_range('1 day', periods=4, freq='h', name='idx') |
| 131 | + result = base.intersection(rng, sort=sort) |
| 132 | + if sort is None: |
| 133 | + expected = expected.sort_values() |
| 134 | + tm.assert_index_equal(result, expected) |
| 135 | + assert result.name == expected.name |
| 136 | + assert result.freq == expected.freq |
| 137 | + |
| 138 | + @pytest.mark.parametrize( |
| 139 | + "rng, expected", |
| 140 | + # part intersection works |
| 141 | + [ |
| 142 | + (TimedeltaIndex(['5 hour', '2 hour', '4 hour', '9 hour'], |
| 143 | + name='idx'), |
| 144 | + TimedeltaIndex(['2 hour', '4 hour'], name='idx')), |
| 145 | + # reordered part intersection |
| 146 | + (TimedeltaIndex(['2 hour', '5 hour', '5 hour', '1 hour'], |
| 147 | + name='other'), |
| 148 | + TimedeltaIndex(['1 hour', '2 hour'], name=None)), |
| 149 | + # reveresed index |
| 150 | + (TimedeltaIndex(['1 hour', '2 hour', '4 hour', '3 hour'], |
| 151 | + name='idx')[::-1], |
| 152 | + TimedeltaIndex(['1 hour', '2 hour', '4 hour', '3 hour'], |
| 153 | + name='idx'))]) |
| 154 | + @pytest.mark.parametrize("sort", [None, False]) |
| 155 | + def test_intersection_non_monotonic(self, rng, expected, sort): |
| 156 | + # 24471 non-monotonic |
| 157 | + base = TimedeltaIndex(['1 hour', '2 hour', '4 hour', '3 hour'], |
| 158 | + name='idx') |
| 159 | + result = base.intersection(rng, sort=sort) |
| 160 | + if sort is None: |
| 161 | + expected = expected.sort_values() |
| 162 | + tm.assert_index_equal(result, expected) |
| 163 | + assert result.name == expected.name |
| 164 | + |
| 165 | + # if reveresed order, frequency is still the same |
| 166 | + if all(base == rng[::-1]) and sort is None: |
| 167 | + assert isinstance(result.freq, Hour) |
| 168 | + else: |
| 169 | + assert result.freq is None |
0 commit comments