@@ -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