Skip to content

Commit fea7a2b

Browse files
author
Matt Roeschke
committed
adjust date_range tests for D
1 parent 4062597 commit fea7a2b

File tree

5 files changed

+53
-47
lines changed

5 files changed

+53
-47
lines changed

doc/source/whatsnew/v0.24.0.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ that the dates have been converted to UTC
319319

320320
:class:`Day` and associated frequency alias ``'D'`` were documented to represent
321321
a calendar day; however, arithmetic and operations with :class:`Day` sometimes
322-
respected absolute time (i.e. ```Day(n)`` and acted identically to ```Timedelta(days=n)``).
322+
respected absolute time instead (i.e. ```Day(n)`` and acted identically to ```Timedelta(days=n)``).
323323

324324
*Previous Behavior*:
325325

pandas/core/arrays/datetimes.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,11 @@ def _generate_range(cls, start, end, periods, freq, tz=None,
241241

242242
tz, _ = _infer_tz_from_endpoints(start, end, tz)
243243

244-
# If we have a Timedelta-like frequency (Tick) make sure tz
245-
# is set before generating the range. For relative frequencies,
246-
# generate the range with naive dates.
244+
# Make sure start and end are timezone localized if:
245+
# 1) freq = a Timedelta-like frequency (Tick)
246+
# 2) freq = None i.e. generating a linspaced range
247247
localize_args = {'tz': None}
248-
if isinstance(freq, Tick):
248+
if isinstance(freq, Tick) or freq is None:
249249
localize_args = {'tz': tz, 'ambiguous': False}
250250
if tz is not None:
251251
# Localize the start and end arguments
@@ -287,8 +287,6 @@ def _generate_range(cls, start, end, periods, freq, tz=None,
287287
end = end.tz_localize(tz).asm8
288288
else:
289289
# Create a linearly spaced date_range in local time
290-
start = start.tz_localize(tz)
291-
end = end.tz_localize(tz)
292290
arr = np.linspace(start.value, end.value, periods)
293291
index = cls._simple_new(arr.astype('M8[ns]'), freq=None, tz=tz)
294292

pandas/tests/indexes/datetimes/test_date_range.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -336,28 +336,28 @@ def test_range_tz_pytz(self):
336336
assert dr[0] == start
337337
assert dr[2] == end
338338

339-
def test_range_tz_dst_straddle_pytz(self):
340-
tz = timezone('US/Eastern')
341-
dates = [(tz.localize(datetime(2014, 3, 6)),
342-
tz.localize(datetime(2014, 3, 12))),
343-
(tz.localize(datetime(2013, 11, 1)),
344-
tz.localize(datetime(2013, 11, 6)))]
345-
for (start, end) in dates:
346-
dr = date_range(start, end, freq='D')
347-
assert dr[0] == start
348-
assert dr[-1] == end
349-
assert np.all(dr.hour == 0)
350-
351-
dr = date_range(start, end, freq='D', tz='US/Eastern')
352-
assert dr[0] == start
353-
assert dr[-1] == end
354-
assert np.all(dr.hour == 0)
355-
356-
dr = date_range(start.replace(tzinfo=None), end.replace(
357-
tzinfo=None), freq='D', tz='US/Eastern')
358-
assert dr[0] == start
359-
assert dr[-1] == end
360-
assert np.all(dr.hour == 0)
339+
@pytest.mark.parametrize('start, end', [
340+
[Timestamp(datetime(2014, 3, 6), tz='US/Eastern'),
341+
Timestamp(datetime(2014, 3, 12), tz='US/Eastern')],
342+
[Timestamp(datetime(2013, 11, 1), tz='US/Eastern'),
343+
Timestamp(datetime(2013, 11, 6), tz='US/Eastern')]
344+
])
345+
def test_range_tz_dst_straddle_pytz(self, start, end):
346+
dr = date_range(start, end, freq='CD')
347+
assert dr[0] == start
348+
assert dr[-1] == end
349+
assert np.all(dr.hour == 0)
350+
351+
dr = date_range(start, end, freq='CD', tz='US/Eastern')
352+
assert dr[0] == start
353+
assert dr[-1] == end
354+
assert np.all(dr.hour == 0)
355+
356+
dr = date_range(start.replace(tzinfo=None), end.replace(
357+
tzinfo=None), freq='CD', tz='US/Eastern')
358+
assert dr[0] == start
359+
assert dr[-1] == end
360+
assert np.all(dr.hour == 0)
361361

362362
def test_range_tz_dateutil(self):
363363
# see gh-2906

pandas/tests/indexes/datetimes/test_timezones.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -429,24 +429,24 @@ def test_dti_tz_localize_utc_conversion(self, tz):
429429
with pytest.raises(pytz.NonExistentTimeError):
430430
rng.tz_localize(tz)
431431

432-
def test_dti_tz_localize_roundtrip(self, tz_aware_fixture):
432+
@pytest.mark.parametrize('idx', [
433+
date_range(start='2014-01-01', end='2014-12-31', freq='M'),
434+
date_range(start='2014-01-01', end='2014-12-31', freq='CD'),
435+
date_range(start='2014-01-01', end='2014-03-01', freq='H'),
436+
date_range(start='2014-08-01', end='2014-10-31', freq='T')
437+
])
438+
def test_dti_tz_localize_roundtrip(self, tz_aware_fixture, idx):
433439
tz = tz_aware_fixture
440+
localized = idx.tz_localize(tz)
441+
expected = date_range(start=idx[0], end=idx[-1], freq=idx.freq,
442+
tz=tz)
443+
tm.assert_index_equal(localized, expected)
444+
with pytest.raises(TypeError):
445+
localized.tz_localize(tz)
434446

435-
idx1 = date_range(start='2014-01-01', end='2014-12-31', freq='M')
436-
idx2 = date_range(start='2014-01-01', end='2014-12-31', freq='D')
437-
idx3 = date_range(start='2014-01-01', end='2014-03-01', freq='H')
438-
idx4 = date_range(start='2014-08-01', end='2014-10-31', freq='T')
439-
for idx in [idx1, idx2, idx3, idx4]:
440-
localized = idx.tz_localize(tz)
441-
expected = date_range(start=idx[0], end=idx[-1], freq=idx.freq,
442-
tz=tz)
443-
tm.assert_index_equal(localized, expected)
444-
with pytest.raises(TypeError):
445-
localized.tz_localize(tz)
446-
447-
reset = localized.tz_localize(None)
448-
tm.assert_index_equal(reset, idx)
449-
assert reset.tzinfo is None
447+
reset = localized.tz_localize(None)
448+
tm.assert_index_equal(reset, idx)
449+
assert reset.tzinfo is None
450450

451451
def test_dti_tz_localize_naive(self):
452452
rng = date_range('1/1/2011', periods=100, freq='H')
@@ -1033,7 +1033,9 @@ def test_date_range_span_dst_transition(self, tzstr):
10331033
assert (dr.hour == 0).all()
10341034

10351035
dr = date_range('2012-11-02', periods=10, tz=tzstr)
1036-
assert (dr.hour == 0).all()
1036+
result = dr.hour
1037+
expected = Index([0, 0, 0, 23, 23, 23, 23, 23, 23, 23])
1038+
tm.assert_index_equal(result, expected)
10371039

10381040
@pytest.mark.parametrize('tzstr', ['US/Eastern', 'dateutil/US/Eastern'])
10391041
def test_date_range_timezone_str_argument(self, tzstr):

pandas/tseries/offsets.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2348,7 +2348,7 @@ class Nano(Tick):
23482348

23492349

23502350
def generate_range(start=None, end=None, periods=None,
2351-
offset=BDay()):
2351+
offset=BDay(), time_rule=None):
23522352
"""
23532353
Generates a sequence of dates corresponding to the specified time
23542354
offset. Similar to dateutil.rrule except uses pandas DateOffset
@@ -2360,6 +2360,8 @@ def generate_range(start=None, end=None, periods=None,
23602360
end : datetime (default None)
23612361
periods : int, (default None)
23622362
offset : DateOffset, (default BDay())
2363+
time_rule : (legacy) name of DateOffset object to be used, optional
2364+
Corresponds with names expected by tseries.frequencies.get_offset
23632365
23642366
Notes
23652367
-----
@@ -2372,6 +2374,10 @@ def generate_range(start=None, end=None, periods=None,
23722374
-------
23732375
dates : generator object
23742376
"""
2377+
if time_rule is not None:
2378+
from pandas.tseries.frequencies import get_offset
2379+
2380+
offset = get_offset(time_rule)
23752381

23762382
start = to_datetime(start)
23772383
end = to_datetime(end)

0 commit comments

Comments
 (0)