Skip to content

Commit 99125bd

Browse files
committed
Fix bug (GH17391)
1 parent c4fa3c9 commit 99125bd

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

doc/source/whatsnew/v0.25.0.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ Datetimelike
141141
Timedelta
142142
^^^^^^^^^
143143

144-
-
144+
- bug when TimedeltaIndex intersects with another decreasing TimedeltaIndex (:issue:`17391`)
145145
-
146146
-
147147

pandas/core/indexes/timedeltas.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,10 @@ def intersection(self, other):
474474
return self
475475
if len(other) == 0:
476476
return other
477+
478+
self = self.sort_values()
479+
other = other.sort_values()
480+
477481
# to make our life easier, "sort" the two ranges
478482
if self[0] <= other[0]:
479483
left, right = self, other
@@ -486,7 +490,10 @@ def intersection(self, other):
486490
if end < start:
487491
return type(self)(data=[])
488492
else:
489-
lslice = slice(*left.slice_locs(start, end))
493+
lstart, lend = left.slice_locs(start, end)
494+
lslice = np.arange(lstart, lend)
495+
mask = [left_elem in right for left_elem in left[lstart: lend]]
496+
lslice = lslice[mask]
490497
left_chunk = left.values[lslice]
491498
return self._shallow_copy(left_chunk)
492499

pandas/tests/indexes/timedeltas/test_setops.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import numpy as np
2+
import pytest
23

34
import pandas as pd
45
from pandas import Int64Index, TimedeltaIndex, timedelta_range
@@ -73,3 +74,34 @@ def test_intersection_bug_1708(self):
7374
result = index_1 & index_2
7475
expected = timedelta_range('1 day 01:00:00', periods=3, freq='h')
7576
tm.assert_index_equal(result, expected)
77+
78+
@pytest.mark.parametrize('left, right, expected', [
79+
(pd.to_timedelta(range(3), unit='s'),
80+
pd.to_timedelta(range(2, -1, -1), unit='s'),
81+
pd.to_timedelta(range(3), unit='s')),
82+
(pd.to_timedelta(range(6, 3, -1), unit='s'),
83+
pd.to_timedelta(range(5, 1, -1), unit='s'),
84+
TimedeltaIndex(['00:00:04', '00:00:05'])),
85+
(pd.to_timedelta(range(5, 1, -1), unit='s'),
86+
pd.to_timedelta(range(6, 3, -1), unit='s'),
87+
TimedeltaIndex(['00:00:04', '00:00:05'])),
88+
(pd.to_timedelta((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20), unit='s'),
89+
pd.to_timedelta(range(1, 20), unit='s'),
90+
pd.to_timedelta(range(1, 11), unit='s')),
91+
(pd.to_timedelta((1, 2, 5, 6, 7), unit='s'),
92+
pd.to_timedelta((3, 5, 6, 7), unit='s'),
93+
pd.to_timedelta((5, 6, 7), unit='s'))
94+
])
95+
def test_intersect(self, left, right, expected):
96+
# GH 17391
97+
result = left.intersection(right)
98+
tm.assert_index_equal(result, expected)
99+
100+
@pytest.mark.parametrize('idx', [
101+
pd.to_timedelta(range(1, 2), unit='s'),
102+
pd.to_timedelta(range(2, -1, -1), unit='s')
103+
])
104+
def test_intersect_self(self, idx):
105+
# GH 17391
106+
result = idx.intersection(idx)
107+
tm.assert_index_equal(idx, result)

0 commit comments

Comments
 (0)