@@ -34,10 +34,11 @@ def test_dt_namespace_accessor(self):
34
34
ok_for_dt = DatetimeIndex ._datetimelike_ops
35
35
ok_for_dt_methods = ['to_period' , 'to_pydatetime' , 'tz_localize' ,
36
36
'tz_convert' , 'normalize' , 'strftime' , 'round' ,
37
- 'floor' , 'ceil' , 'day_name' , 'month_name' ]
37
+ 'floor' , 'ceil' , 'day_name' , 'month_name' ,
38
+ 'set_freq' ]
38
39
ok_for_td = TimedeltaIndex ._datetimelike_ops
39
40
ok_for_td_methods = ['components' , 'to_pytimedelta' , 'total_seconds' ,
40
- 'round' , 'floor' , 'ceil' ]
41
+ 'round' , 'floor' , 'ceil' , 'set_freq' ]
41
42
42
43
def get_expected (s , name ):
43
44
result = getattr (Index (s ._values ), prop )
@@ -460,3 +461,38 @@ def test_datetime_understood(self):
460
461
expected = pd .Series (pd .to_datetime ([
461
462
'2011-12-26' , '2011-12-27' , '2011-12-28' ]))
462
463
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