Skip to content

Commit 441a1f2

Browse files
committed
Merge pull request #7525 from jreback/slice
REGR: Regression in datetimelike slice indexing with a duplicated index and non-exact end-points (GH7523)
2 parents c42a4c6 + 3f9749c commit 441a1f2

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

doc/source/v0.14.1.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ Bug Fixes
167167
~~~~~~~~~
168168
- Bug in ``DataFrame.where`` with a symmetric shaped frame and a passed other of a DataFrame (:issue:`7506`)
169169
- Bug in Panel indexing with a multi-index axis (:issue:`7516`)
170+
- Regression in datetimelike slice indexing with a duplicated index and non-exact end-points (:issue:`7523`)
170171

171172
- Bug in timeops with non-aligned Series (:issue:`7500`)
172173

pandas/core/index.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1758,7 +1758,11 @@ def _get_slice(starting_value, offset, search_side, slice_property,
17581758

17591759
except KeyError:
17601760
if self.is_monotonic:
1761-
if not is_unique:
1761+
1762+
# we are duplicated but non-unique
1763+
# so if we have an indexer then we are done
1764+
# else search for it (GH 7523)
1765+
if not is_unique and is_integer(search_value):
17621766
slc = search_value
17631767
else:
17641768
slc = self.searchsorted(search_value,

pandas/tseries/tests/test_timeseries.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2966,6 +2966,42 @@ def test_slice_locs_indexerror(self):
29662966
s = Series(lrange(100000), times)
29672967
s.ix[datetime(1900, 1, 1):datetime(2100, 1, 1)]
29682968

2969+
def test_slicing_datetimes(self):
2970+
2971+
# GH 7523
2972+
2973+
# unique
2974+
df = DataFrame(np.arange(4.,dtype='float64'),
2975+
index=[datetime(2001, 1, i, 10, 00) for i in [1,2,3,4]])
2976+
result = df.ix[datetime(2001,1,1,10):]
2977+
assert_frame_equal(result,df)
2978+
result = df.ix[:datetime(2001,1,4,10)]
2979+
assert_frame_equal(result,df)
2980+
result = df.ix[datetime(2001,1,1,10):datetime(2001,1,4,10)]
2981+
assert_frame_equal(result,df)
2982+
2983+
result = df.ix[datetime(2001,1,1,11):]
2984+
expected = df.iloc[1:]
2985+
assert_frame_equal(result,expected)
2986+
result = df.ix['20010101 11':]
2987+
assert_frame_equal(result,expected)
2988+
2989+
# duplicates
2990+
df = pd.DataFrame(np.arange(5.,dtype='float64'),
2991+
index=[datetime(2001, 1, i, 10, 00) for i in [1,2,2,3,4]])
2992+
2993+
result = df.ix[datetime(2001,1,1,10):]
2994+
assert_frame_equal(result,df)
2995+
result = df.ix[:datetime(2001,1,4,10)]
2996+
assert_frame_equal(result,df)
2997+
result = df.ix[datetime(2001,1,1,10):datetime(2001,1,4,10)]
2998+
assert_frame_equal(result,df)
2999+
3000+
result = df.ix[datetime(2001,1,1,11):]
3001+
expected = df.iloc[1:]
3002+
assert_frame_equal(result,expected)
3003+
result = df.ix['20010101 11':]
3004+
assert_frame_equal(result,expected)
29693005

29703006
class TestSeriesDatetime64(tm.TestCase):
29713007

@@ -3054,7 +3090,7 @@ def test_intersection(self):
30543090
for tz in [None, 'Asia/Tokyo']:
30553091
rng = date_range('6/1/2000', '6/30/2000', freq='D', name='idx')
30563092

3057-
# if target has the same name, it is preserved
3093+
# if target has the same name, it is preserved
30583094
rng2 = date_range('5/15/2000', '6/20/2000', freq='D', name='idx')
30593095
expected2 = date_range('6/1/2000', '6/20/2000', freq='D', name='idx')
30603096

0 commit comments

Comments
 (0)