Skip to content

Commit 8c6564b

Browse files
committed
Add set_freq to dt accessor
1 parent 8762206 commit 8c6564b

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

pandas/core/indexes/datetimes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ def _add_comparison_methods(cls):
320320
_other_ops = ['date', 'time']
321321
_datetimelike_ops = _field_ops + _object_ops + _bool_ops + _other_ops
322322
_datetimelike_methods = ['to_period', 'tz_localize',
323-
'tz_convert',
323+
'tz_convert', 'set_freq',
324324
'normalize', 'strftime', 'round', 'floor',
325325
'ceil', 'month_name', 'day_name']
326326

pandas/core/indexes/timedeltas.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def _join_i8_wrapper(joinf, **kwargs):
178178
_field_ops = ['days', 'seconds', 'microseconds', 'nanoseconds']
179179
_datetimelike_ops = _field_ops + _object_ops + _bool_ops
180180
_datetimelike_methods = ["to_pytimedelta", "total_seconds",
181-
"round", "floor", "ceil"]
181+
"round", "floor", "ceil", "set_freq"]
182182

183183
@classmethod
184184
def _add_comparison_methods(cls):

pandas/tests/series/test_datetime_values.py

+38-2
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@ def test_dt_namespace_accessor(self):
3434
ok_for_dt = DatetimeIndex._datetimelike_ops
3535
ok_for_dt_methods = ['to_period', 'to_pydatetime', 'tz_localize',
3636
'tz_convert', 'normalize', 'strftime', 'round',
37-
'floor', 'ceil', 'day_name', 'month_name']
37+
'floor', 'ceil', 'day_name', 'month_name',
38+
'set_freq']
3839
ok_for_td = TimedeltaIndex._datetimelike_ops
3940
ok_for_td_methods = ['components', 'to_pytimedelta', 'total_seconds',
40-
'round', 'floor', 'ceil']
41+
'round', 'floor', 'ceil', 'set_freq']
4142

4243
def get_expected(s, name):
4344
result = getattr(Index(s._values), prop)
@@ -460,3 +461,38 @@ def test_datetime_understood(self):
460461
expected = pd.Series(pd.to_datetime([
461462
'2011-12-26', '2011-12-27', '2011-12-28']))
462463
tm.assert_series_equal(result, expected)
464+
465+
@pytest.mark.xfail(reason='GH 20937')
466+
@pytest.mark.parametrize('data, new_freq', [
467+
(date_range('20180101', periods=3), 'B'),
468+
(date_range('20180101', periods=3, tz='US/Eastern'), 'B'),
469+
(timedelta_range('1 day', periods=3), '86400S')])
470+
def test_set_freq(self, data, new_freq):
471+
# GH 20886
472+
s = Series(data)
473+
474+
# can set to alternate freq
475+
result = s.dt.set_freq(new_freq)
476+
assert result.dt.freq == new_freq
477+
478+
# can reset to None
479+
result = s.dt.set_freq(None)
480+
assert result.dt.freq is None
481+
482+
@pytest.mark.parametrize('data', [
483+
date_range('20180101', periods=3),
484+
date_range('20180101', periods=3, tz='US/Eastern'),
485+
timedelta_range('1 day', periods=3)])
486+
def test_set_freq_errors(self, data):
487+
# GH 20886
488+
s = Series(data)
489+
490+
# setting with an incompatible freq
491+
msg = ('Inferred frequency D from passed values does not conform to '
492+
'passed frequency 5D')
493+
with tm.assert_raises_regex(ValueError, msg):
494+
s.dt.set_freq('5D')
495+
496+
# setting with non-freq string
497+
with tm.assert_raises_regex(ValueError, 'Invalid frequency'):
498+
s.dt.set_freq('foo')

0 commit comments

Comments
 (0)