Skip to content

Commit 3136390

Browse files
committed
ENH: deprecate offset/timerule for freq, add future warnings
1 parent ee6262d commit 3136390

File tree

6 files changed

+88
-48
lines changed

6 files changed

+88
-48
lines changed

pandas/core/datetools.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1257,7 +1257,7 @@ def _figure_out_timezone(start, end, tzinfo):
12571257
_daterange_cache = {}
12581258

12591259
def generate_range(start=None, end=None, periods=None,
1260-
offset=BDay(), time_rule=None, _deprecated=True):
1260+
offset=BDay(), time_rule=None):
12611261
"""
12621262
Generates a sequence of dates corresponding to the specified time
12631263
offset. Similar to dateutil.rrule except uses pandas DateOffset

pandas/core/frame.py

+41-10
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
_default_index, _stringify)
2929
from pandas.core.daterange import DateRange
3030
from pandas.core.generic import NDFrame
31-
from pandas.core.index import Index, MultiIndex, NULL_INDEX, _ensure_index
31+
from pandas.core.index import (Index, DatetimeIndex, MultiIndex, NULL_INDEX,
32+
_ensure_index)
3233
from pandas.core.indexing import _NDFrameIndexer, _maybe_droplevels
3334
from pandas.core.internals import BlockManager, make_block, form_blocks
3435
from pandas.core.series import Series, _radd_compat
@@ -661,7 +662,8 @@ def from_records(cls, data, index=None, exclude=None, columns=None,
661662
columns = names
662663
warnings.warn("'names' parameter to DataFrame.from_records is "
663664
"being renamed to 'columns', 'names' will be "
664-
"removed in 0.8.0", FutureWarning)
665+
"removed in 0.8.0",
666+
FutureWarning)
665667

666668
if isinstance(data, (np.ndarray, DataFrame, dict)):
667669
columns, sdict = _rec_to_dict(data)
@@ -2805,7 +2807,30 @@ def unstack(self, level=-1):
28052807
#----------------------------------------------------------------------
28062808
# Time series-related
28072809

2808-
def asfreq(self, freq, method=None):
2810+
def tofreq(self, freq, method=None):
2811+
"""
2812+
Convert all TimeSeries inside to specified frequency using DateOffset
2813+
objects. Optionally provide fill method to pad/backfill missing values.
2814+
2815+
Parameters
2816+
----------
2817+
freq : DateOffset object, or string
2818+
method : {'backfill', 'bfill', 'pad', 'ffill', None}
2819+
Method to use for filling holes in reindexed Series
2820+
pad / ffill: propagate last valid observation forward to next valid
2821+
backfill / bfill: use NEXT valid observation to fill methdo
2822+
2823+
Returns
2824+
-------
2825+
converted : DataFrame
2826+
"""
2827+
if len(self.index) == 0:
2828+
return self.copy()
2829+
dti = DatetimeIndex(self.index[0], self.index[-1], freq=freq)
2830+
return self.reindex(dti, method=method)
2831+
2832+
2833+
def asfreq(self, offset, method=None):
28092834
"""
28102835
Convert all TimeSeries inside to specified frequency using DateOffset
28112836
objects. Optionally provide fill method to pad/backfill missing values.
@@ -2823,14 +2848,19 @@ def asfreq(self, freq, method=None):
28232848
-------
28242849
converted : DataFrame
28252850
"""
2851+
2852+
import warnings
2853+
warnings.warn("The 'asfreq' method is deprecated; use 'tofreq' "
2854+
" and the new pandas offsets",
2855+
FutureWarning)
2856+
28262857
if len(self.index) == 0:
28272858
return self.copy()
28282859

2829-
if isinstance(freq, datetools.DateOffset):
2830-
dateRange = DateRange(self.index[0], self.index[-1], offset=freq)
2860+
if isinstance(offset, datetools.DateOffset):
2861+
dateRange = DateRange(self.index[0], self.index[-1], offset=offset)
28312862
else:
2832-
dateRange = DateRange(self.index[0], self.index[-1],
2833-
time_rule=freq)
2863+
dateRange = DateRange(self.index[0], self.index[-1], time_rule=offset)
28342864

28352865
return self.reindex(dateRange, method=method)
28362866

@@ -2852,13 +2882,13 @@ def diff(self, periods=1):
28522882
def shift(self, periods, freq=None, **kwds):
28532883
"""
28542884
Shift the index of the DataFrame by desired number of periods with an
2855-
optional time offset
2885+
optional time freq
28562886
28572887
Parameters
28582888
----------
28592889
periods : int
28602890
Number of periods to move, can be positive or negative
2861-
offset : DateOffset, timedelta, or time rule string, optional
2891+
freq : DateOffset, timedelta, or time rule string, optional
28622892
Increment to use from datetools module or time rule (e.g. 'EOM')
28632893
28642894
Returns
@@ -2881,7 +2911,8 @@ def shift(self, periods, freq=None, **kwds):
28812911
if warn:
28822912
import warnings
28832913
warnings.warn("'timeRule' and 'offset' parameters are deprecated,"
2884-
" please use 'freq' instead", FutureWarning)
2914+
" please use 'freq' instead",
2915+
FutureWarning)
28852916

28862917
if isinstance(offset, basestring):
28872918
offset = datetools.to_offset(offset)

pandas/core/index.py

+29-20
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ def asof(self, label):
345345
def sort(self, *args, **kwargs):
346346
raise Exception('Cannot sort an Index object')
347347

348-
def shift(self, periods, offset):
348+
def shift(self, periods, freq):
349349
"""
350350
Shift Index containing datetime objects by input number of periods and
351351
DateOffset
@@ -358,7 +358,7 @@ def shift(self, periods, offset):
358358
# OK because immutable
359359
return self
360360

361-
offset = periods * offset
361+
offset = periods * freq
362362
return Index([idx + offset for idx in self])
363363

364364
def argsort(self, *args, **kwargs):
@@ -1120,15 +1120,27 @@ class DatetimeIndex(Int64Index):
11201120
_sarr_cache = None
11211121

11221122
def __new__(cls, data=None,
1123-
offset=None, start=None, end=None, periods=None,
1123+
freq=None, start=None, end=None, periods=None,
11241124
dtype=None, copy=False, name=None, tzinfo=None,
1125-
_deprecated=False, **kwds):
1125+
**kwds):
1126+
1127+
warn = False
1128+
if 'offset' in kwds and kwds['offset']:
1129+
freq = kwds['offset']
1130+
warn = True
1131+
1132+
if warn:
1133+
import warnings
1134+
warnings.warn("parameter 'offset' is deprecated, "
1135+
"please use 'freq' instead",
1136+
FutureWarning)
1137+
if isinstance(freq, basestring):
1138+
freq = datetools.getOffset(freq)
1139+
else:
1140+
if isinstance(freq, basestring):
1141+
freq = datetools.to_offset(freq)
11261142

1127-
if isinstance(offset, basestring):
1128-
if _deprecated:
1129-
offset = datetools.getOffset(offset)
1130-
else:
1131-
offset = datetools.to_offset(offset)
1143+
offset = freq
11321144

11331145
if data is None and offset is None:
11341146
raise ValueError("Must provide offset argument if no data is "
@@ -1153,8 +1165,7 @@ def __new__(cls, data=None,
11531165

11541166
if useCache:
11551167
index = cls._cached_range(start, end, periods=periods,
1156-
offset=offset, name=name,
1157-
_deprecated=_deprecated)
1168+
offset=offset, name=name)
11581169
else:
11591170
if isinstance(offset, datetools.Tick):
11601171
if periods is None:
@@ -1169,8 +1180,7 @@ def __new__(cls, data=None,
11691180

11701181
else:
11711182
xdr = datetools.generate_range(start=start, end=end,
1172-
periods=periods, offset=offset,
1173-
_deprecated=_deprecated)
1183+
periods=periods, offset=offset)
11741184

11751185
data = _dt_unbox_array(list(xdr))
11761186

@@ -1229,7 +1239,7 @@ def __new__(cls, data=None,
12291239

12301240
@classmethod
12311241
def _cached_range(cls, start=None, end=None, periods=None, offset=None,
1232-
name=None, _deprecated=False):
1242+
name=None):
12331243
if start is not None:
12341244
start = Timestamp(start)
12351245
if end is not None:
@@ -1241,8 +1251,7 @@ def _cached_range(cls, start=None, end=None, periods=None, offset=None,
12411251
drc = datetools._daterange_cache
12421252
if offset not in drc:
12431253
xdr = datetools.generate_range(offset=offset,
1244-
start=datetools._CACHE_START, end=datetools._CACHE_END,
1245-
_deprecated=_deprecated)
1254+
start=datetools._CACHE_START, end=datetools._CACHE_END)
12461255

12471256
arr = np.array(_dt_unbox_array(list(xdr)),
12481257
dtype='M8[us]', copy=False)
@@ -1341,22 +1350,22 @@ def asobject(self):
13411350
else:
13421351
return Index(_dt_box_array(self.asi8), dtype='object')
13431352

1344-
def shift(self, n, offset=None):
1353+
def shift(self, n, freq=None):
13451354
"""
13461355
Specialized shift which produces a DatetimeIndex
13471356
13481357
Parameters
13491358
----------
13501359
n : int
13511360
Periods to shift by
1352-
offset : DateOffset or timedelta-like, optional
1361+
freq : DateOffset or timedelta-like, optional
13531362
13541363
Returns
13551364
-------
13561365
shifted : DateRange
13571366
"""
1358-
if offset is not None and offset != self.offset:
1359-
return Index.shift(self, n, offset)
1367+
if freq is not None and freq != self.offset:
1368+
return Index.shift(self, n, freq)
13601369

13611370
if n == 0:
13621371
# immutable so OK

pandas/core/series.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -715,8 +715,7 @@ def to_string(self, buf=None, na_rep='NaN', float_format=None,
715715

716716
if nanRep is not None: # pragma: no cover
717717
import warnings
718-
warnings.warn("nanRep is deprecated, use na_rep",
719-
FutureWarning)
718+
warnings.warn("nanRep is deprecated, use na_rep", FutureWarning)
720719
na_rep = nanRep
721720

722721
the_repr = self._get_repr(float_format=float_format, na_rep=na_rep,
@@ -2268,7 +2267,8 @@ def shift(self, periods, freq=None, **kwds):
22682267
if warn:
22692268
import warnings
22702269
warnings.warn("'timeRule' and 'offset' parameters are deprecated,"
2271-
" please use 'freq' instead", FutureWarning)
2270+
" please use 'freq' instead",
2271+
FutureWarning)
22722272

22732273
if isinstance(offset, basestring):
22742274
offset = datetools.to_offset(offset)

pandas/tests/test_daterange.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def test_shift(self):
127127
self.assertEquals(shifted.offset, self.rng.offset)
128128

129129
rng = DateRange(START, END, offset=datetools.bmonthEnd)
130-
shifted = rng.shift(1, offset=datetools.bday)
130+
shifted = rng.shift(1, freq=datetools.bday)
131131
self.assertEquals(shifted[0], rng[0] + datetools.bday)
132132

133133
def test_pickle_unpickle(self):

pandas/tests/test_datetime64.py

+13-13
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class TestDatetime64(unittest.TestCase):
2020

2121
def setUp(self):
2222
dti = DatetimeIndex(start=datetime(2005,1,1),
23-
end=datetime(2005,1,10), offset='Min')
23+
end=datetime(2005,1,10), freq='Min')
2424

2525
self.series = Series(rand(len(dti)), dti)
2626

@@ -215,7 +215,7 @@ def test_dayofmonthoffset(self):
215215
self.assert_(t.weekday() == day)
216216

217217
def test_datetimeindex_accessors(self):
218-
dti = DatetimeIndex(offset='Q@JAN', start=datetime(1997,12,31),
218+
dti = DatetimeIndex(freq='Q@JAN', start=datetime(1997,12,31),
219219
periods=100)
220220

221221
self.assertEquals(dti.year[0], 1998)
@@ -249,9 +249,9 @@ def test_datetimeindex_accessors(self):
249249
self.assertEquals(len(dti.quarter), 100)
250250

251251
def test_datetimeindex_diff(self):
252-
dti1 = DatetimeIndex(offset='Q@JAN', start=datetime(1997,12,31),
252+
dti1 = DatetimeIndex(freq='Q@JAN', start=datetime(1997,12,31),
253253
periods=100)
254-
dti2 = DatetimeIndex(offset='Q@JAN', start=datetime(1997,12,31),
254+
dti2 = DatetimeIndex(freq='Q@JAN', start=datetime(1997,12,31),
255255
periods=98)
256256
self.assert_( len(dti1.diff(dti2)) == 2)
257257

@@ -278,7 +278,7 @@ def test_datetimecache(self):
278278
lib.flush_tcache('W@TUE')
279279

280280
def test_fancy_getitem(self):
281-
dti = DatetimeIndex(offset='WOM@1FRI', start=datetime(2005,1,1),
281+
dti = DatetimeIndex(freq='WOM@1FRI', start=datetime(2005,1,1),
282282
end=datetime(2010,1,1))
283283

284284
s = Series(np.arange(len(dti)), index=dti)
@@ -294,7 +294,7 @@ def test_fancy_getitem(self):
294294
s[datetime(2009,3,6):datetime(2009,6,5)])
295295

296296
def test_fancy_setitem(self):
297-
dti = DatetimeIndex(offset='WOM@1FRI', start=datetime(2005,1,1),
297+
dti = DatetimeIndex(freq='WOM@1FRI', start=datetime(2005,1,1),
298298
end=datetime(2010,1,1))
299299

300300
s = Series(np.arange(len(dti)), index=dti)
@@ -307,7 +307,7 @@ def test_fancy_setitem(self):
307307

308308
def test_custom_grouper(self):
309309

310-
dti = DatetimeIndex(offset='Min', start=datetime(2005,1,1),
310+
dti = DatetimeIndex(freq='Min', start=datetime(2005,1,1),
311311
end=datetime(2005,1,10))
312312

313313
data = np.array([1]*len(dti))
@@ -346,8 +346,8 @@ def test_convert_basic(self):
346346
assert_series_equal(result, expect)
347347

348348
# from daily
349-
dti = DatetimeIndex(start=datetime(2005,1,1),
350-
end=datetime(2005,1,10), offset='D')
349+
dti = DatetimeIndex(start=datetime(2005,1,1), end=datetime(2005,1,10),
350+
freq='D')
351351

352352
s = Series(rand(len(dti)), dti)
353353

@@ -400,8 +400,8 @@ def test_convert_basic(self):
400400

401401
def test_convert_upsample(self):
402402
# from daily
403-
dti = DatetimeIndex(start=datetime(2005,1,1),
404-
end=datetime(2005,1,10), offset='D')
403+
dti = DatetimeIndex(start=datetime(2005,1,1), end=datetime(2005,1,10),
404+
freq='D')
405405

406406
s = Series(rand(len(dti)), dti)
407407

@@ -434,8 +434,8 @@ def test_convert_olhc(self):
434434
self.assertEquals(xs['close'], s[5])
435435

436436
def test_convert_reconvert(self):
437-
dti = DatetimeIndex(start=datetime(2005,1,1),
438-
end=datetime(2005,1,10), offset='D')
437+
dti = DatetimeIndex(start=datetime(2005,1,1), end=datetime(2005,1,10),
438+
freq='D')
439439
s = Series(rand(len(dti)), dti)
440440
s = s.convert('B').convert('8H')
441441
self.assertEquals(len(s), 22)

0 commit comments

Comments
 (0)