Skip to content

Commit 3944a36

Browse files
BUG: date_range closed keyword with timezone aware start/end (GH12684) (pandas-dev#13510)
1 parent 30a3133 commit 3944a36

File tree

3 files changed

+32
-12
lines changed

3 files changed

+32
-12
lines changed

doc/source/whatsnew/v0.18.1.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,7 @@ Bug Fixes
658658
- Bug in ``CategoricalIndex.get_loc`` returns different result from regular ``Index`` (:issue:`12531`)
659659
- Bug in ``PeriodIndex.resample`` where name not propagated (:issue:`12769`)
660660

661-
661+
- Bug in ``date_range`` ``closed`` keyword and timezones (:issue:`12684`).
662662

663663
- Bug in ``pd.concat`` raises ``AttributeError`` when input data contains tz-aware datetime and timedelta (:issue:`12620`)
664664
- Bug in ``pd.concat`` did not handle empty ``Series`` properly (:issue:`11082`)

pandas/tseries/index.py

+7
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,13 @@ def _generate(cls, start, end, periods, name, offset,
541541
ambiguous=ambiguous)
542542
index = index.view(_NS_DTYPE)
543543

544+
# index is localized datetime64 array -> have to convert
545+
# start/end as well to compare
546+
if start is not None:
547+
start = start.tz_localize(tz).asm8
548+
if end is not None:
549+
end = end.tz_localize(tz).asm8
550+
544551
if not left_closed and len(index) and index[0] == start:
545552
index = index[1:]
546553
if not right_closed and len(index) and index[-1] == end:

pandas/tseries/tests/test_daterange.py

+24-11
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ def test_range_closed(self):
485485
begin = datetime(2011, 1, 1)
486486
end = datetime(2014, 1, 1)
487487

488-
for freq in ["3D", "2M", "7W", "3H", "A"]:
488+
for freq in ["1D", "3D", "2M", "7W", "3H", "A"]:
489489
closed = date_range(begin, end, closed=None, freq=freq)
490490
left = date_range(begin, end, closed="left", freq=freq)
491491
right = date_range(begin, end, closed="right", freq=freq)
@@ -501,11 +501,11 @@ def test_range_closed(self):
501501
self.assert_index_equal(expected_right, right)
502502

503503
def test_range_closed_with_tz_aware_start_end(self):
504-
# GH12409
504+
# GH12409, GH12684
505505
begin = Timestamp('2011/1/1', tz='US/Eastern')
506506
end = Timestamp('2014/1/1', tz='US/Eastern')
507507

508-
for freq in ["3D", "2M", "7W", "3H", "A"]:
508+
for freq in ["1D", "3D", "2M", "7W", "3H", "A"]:
509509
closed = date_range(begin, end, closed=None, freq=freq)
510510
left = date_range(begin, end, closed="left", freq=freq)
511511
right = date_range(begin, end, closed="right", freq=freq)
@@ -520,15 +520,28 @@ def test_range_closed_with_tz_aware_start_end(self):
520520
self.assert_index_equal(expected_left, left)
521521
self.assert_index_equal(expected_right, right)
522522

523-
# test with default frequency, UTC
524-
begin = Timestamp('2011/1/1', tz='UTC')
525-
end = Timestamp('2014/1/1', tz='UTC')
523+
begin = Timestamp('2011/1/1')
524+
end = Timestamp('2014/1/1')
525+
begintz = Timestamp('2011/1/1', tz='US/Eastern')
526+
endtz = Timestamp('2014/1/1', tz='US/Eastern')
527+
528+
for freq in ["1D", "3D", "2M", "7W", "3H", "A"]:
529+
closed = date_range(begin, end, closed=None, freq=freq,
530+
tz='US/Eastern')
531+
left = date_range(begin, end, closed="left", freq=freq,
532+
tz='US/Eastern')
533+
right = date_range(begin, end, closed="right", freq=freq,
534+
tz='US/Eastern')
535+
expected_left = left
536+
expected_right = right
526537

527-
intervals = ['left', 'right', None]
528-
for i in intervals:
529-
result = date_range(start=begin, end=end, closed=i)
530-
self.assertEqual(result[0], begin)
531-
self.assertEqual(result[-1], end)
538+
if endtz == closed[-1]:
539+
expected_left = closed[:-1]
540+
if begintz == closed[0]:
541+
expected_right = closed[1:]
542+
543+
self.assert_index_equal(expected_left, left)
544+
self.assert_index_equal(expected_right, right)
532545

533546
def test_range_closed_boundary(self):
534547
# GH 11804

0 commit comments

Comments
 (0)