Skip to content

Commit 802c188

Browse files
committed
BUG: DatetimeIndex.freq can defer by ufunc
1 parent 789e07d commit 802c188

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

pandas/tests/test_index.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3151,6 +3151,39 @@ def test_nat(self):
31513151
self.assertIs(DatetimeIndex([np.nan])[0], pd.NaT)
31523152

31533153

3154+
def test_ufunc_coercions(self):
3155+
idx = date_range('2011-01-01', periods=3, freq='2D', name='x')
3156+
3157+
delta = np.timedelta64(1, 'D')
3158+
for result in [idx + delta, np.add(idx, delta)]:
3159+
tm.assertIsInstance(result, DatetimeIndex)
3160+
exp = date_range('2011-01-02', periods=3, freq='2D', name='x')
3161+
tm.assert_index_equal(result, exp)
3162+
self.assertEqual(result.freq, '2D')
3163+
3164+
for result in [idx - delta, np.subtract(idx, delta)]:
3165+
tm.assertIsInstance(result, DatetimeIndex)
3166+
exp = date_range('2010-12-31', periods=3, freq='2D', name='x')
3167+
tm.assert_index_equal(result, exp)
3168+
self.assertEqual(result.freq, '2D')
3169+
3170+
delta = np.array([np.timedelta64(1, 'D'), np.timedelta64(2, 'D'),
3171+
np.timedelta64(3, 'D')])
3172+
for result in [idx + delta, np.add(idx, delta)]:
3173+
tm.assertIsInstance(result, DatetimeIndex)
3174+
exp = DatetimeIndex(['2011-01-02', '2011-01-05', '2011-01-08'],
3175+
freq='3D', name='x')
3176+
tm.assert_index_equal(result, exp)
3177+
self.assertEqual(result.freq, '3D')
3178+
3179+
for result in [idx - delta, np.subtract(idx, delta)]:
3180+
tm.assertIsInstance(result, DatetimeIndex)
3181+
exp = DatetimeIndex(['2010-12-31', '2011-01-01', '2011-01-02'],
3182+
freq='D', name='x')
3183+
tm.assert_index_equal(result, exp)
3184+
self.assertEqual(result.freq, 'D')
3185+
3186+
31543187
class TestPeriodIndex(DatetimeLike, tm.TestCase):
31553188
_holder = PeriodIndex
31563189
_multiprocess_can_split_ = True
@@ -3306,7 +3339,7 @@ def test_pickle_compat_construction(self):
33063339
def test_ufunc_coercions(self):
33073340
# normal ops are also tested in tseries/test_timedeltas.py
33083341
idx = TimedeltaIndex(['2H', '4H', '6H', '8H', '10H'],
3309-
freq='2H', name='x')
3342+
freq='2H', name='x')
33103343

33113344
for result in [idx * 2, np.multiply(idx, 2)]:
33123345
tm.assertIsInstance(result, TimedeltaIndex)
@@ -3323,7 +3356,7 @@ def test_ufunc_coercions(self):
33233356
self.assertEqual(result.freq, 'H')
33243357

33253358
idx = TimedeltaIndex(['2H', '4H', '6H', '8H', '10H'],
3326-
freq='2H', name='x')
3359+
freq='2H', name='x')
33273360
for result in [ - idx, np.negative(idx)]:
33283361
tm.assertIsInstance(result, TimedeltaIndex)
33293362
exp = TimedeltaIndex(['-2H', '-4H', '-6H', '-8H', '-10H'],
@@ -3332,7 +3365,7 @@ def test_ufunc_coercions(self):
33323365
self.assertEqual(result.freq, '-2H')
33333366

33343367
idx = TimedeltaIndex(['-2H', '-1H', '0H', '1H', '2H'],
3335-
freq='H', name='x')
3368+
freq='H', name='x')
33363369
for result in [ abs(idx), np.absolute(idx)]:
33373370
tm.assertIsInstance(result, TimedeltaIndex)
33383371
exp = TimedeltaIndex(['2H', '1H', '0H', '1H', '2H'],

pandas/tseries/index.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,14 @@ def _sub_datelike(self, other):
694694
result = self._maybe_mask_results(result,fill_value=tslib.iNaT)
695695
return TimedeltaIndex(result,name=self.name,copy=False)
696696

697+
def _maybe_update_attributes(self, attrs):
698+
""" Update Index attributes (e.g. freq) depending on op """
699+
freq = attrs.get('freq', None)
700+
if freq is not None:
701+
# no need to infer if freq is None
702+
attrs['freq'] = 'infer'
703+
return attrs
704+
697705
def _add_delta(self, delta):
698706
from pandas import TimedeltaIndex
699707
name = self.name

0 commit comments

Comments
 (0)