Skip to content

Commit 71f652d

Browse files
committed
Merge pull request #11806 from thrasibule/daterange_fix
be more careful with half-opened date_range
2 parents a5686bb + 1a51b41 commit 71f652d

File tree

3 files changed

+29
-5
lines changed

3 files changed

+29
-5
lines changed

doc/source/whatsnew/v0.18.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Bug Fixes
190190
- Bug in ``GroupBy.size`` when data-frame is empty. (:issue:`11699`)
191191
- Bug in ``Period.end_time`` when a multiple of time period is requested (:issue:`11738`)
192192
- Regression in ``.clip`` with tz-aware datetimes (:issue:`11838`)
193+
- Bug in ``date_range`` when the boundaries fell on the frequency (:issue:`11804`)
193194

194195

195196

pandas/tseries/index.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -486,10 +486,9 @@ def _generate(cls, start, end, periods, name, offset,
486486
index = index.view(_NS_DTYPE)
487487

488488
index = cls._simple_new(index, name=name, freq=offset, tz=tz)
489-
490-
if not left_closed:
489+
if not left_closed and len(index) and index[0] == start:
491490
index = index[1:]
492-
if not right_closed:
491+
if not right_closed and len(index) and index[-1] == end:
493492
index = index[:-1]
494493

495494
return index

pandas/tseries/tests/test_daterange.py

+26-2
Original file line numberDiff line numberDiff line change
@@ -477,13 +477,37 @@ def test_range_closed(self):
477477
closed = date_range(begin, end, closed=None, freq=freq)
478478
left = date_range(begin, end, closed="left", freq=freq)
479479
right = date_range(begin, end, closed="right", freq=freq)
480+
expected_left = left
481+
expected_right = right
480482

481-
expected_left = closed[:-1]
482-
expected_right = closed[1:]
483+
if end == closed[-1]:
484+
expected_left = closed[:-1]
485+
if begin == closed[0]:
486+
expected_right = closed[1:]
483487

484488
self.assertTrue(expected_left.equals(left))
485489
self.assertTrue(expected_right.equals(right))
486490

491+
def test_range_closed_boundary(self):
492+
# GH 11804
493+
for closed in ['right', 'left', None]:
494+
right_boundary = date_range('2015-09-12', '2015-12-01', freq='QS-MAR', closed=closed)
495+
left_boundary = date_range('2015-09-01', '2015-09-12', freq='QS-MAR', closed=closed)
496+
both_boundary = date_range('2015-09-01', '2015-12-01', freq='QS-MAR', closed=closed)
497+
expected_right = expected_left = expected_both = both_boundary
498+
499+
if closed == 'right':
500+
expected_left = both_boundary[1:]
501+
if closed == 'left':
502+
expected_right = both_boundary[:-1]
503+
if closed is None:
504+
expected_right = both_boundary[1:]
505+
expected_left = both_boundary[:-1]
506+
507+
self.assertTrue(right_boundary.equals(expected_right))
508+
self.assertTrue(left_boundary.equals(expected_left))
509+
self.assertTrue(both_boundary.equals(expected_both))
510+
487511
def test_years_only(self):
488512
# GH 6961
489513
dr = date_range('2014', '2015', freq='M')

0 commit comments

Comments
 (0)