Skip to content

Commit 4296c3a

Browse files
committed
Merge pull request #7320 from sinhrks/delete
BUG: Revisit Index.delete preserves freq
2 parents 23cca55 + f5c7dad commit 4296c3a

File tree

3 files changed

+94
-19
lines changed

3 files changed

+94
-19
lines changed

pandas/core/index.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -1774,9 +1774,7 @@ def delete(self, loc):
17741774
-------
17751775
new_index : Index
17761776
"""
1777-
return self._simple_new(np.delete(self, loc), self.name,
1778-
freq=getattr(self, 'freq', None),
1779-
tz=getattr(self, 'tz', None))
1777+
return np.delete(self, loc)
17801778

17811779
def insert(self, loc, item):
17821780
"""

pandas/tseries/index.py

+28
Original file line numberDiff line numberDiff line change
@@ -1608,6 +1608,34 @@ def insert(self, loc, item):
16081608
return self.asobject.insert(loc, item)
16091609
raise TypeError("cannot insert DatetimeIndex with incompatible label")
16101610

1611+
def delete(self, loc):
1612+
"""
1613+
Make new DatetimeIndex with passed location deleted
1614+
Returns
1615+
1616+
loc: int, slice or array of ints
1617+
Indicate which sub-arrays to remove.
1618+
1619+
-------
1620+
new_index : DatetimeIndex
1621+
"""
1622+
new_dates = np.delete(self.asi8, loc)
1623+
1624+
freq = None
1625+
if lib.is_integer(loc):
1626+
if loc in (0, -len(self), -1, len(self) - 1):
1627+
freq = self.freq
1628+
else:
1629+
if com.is_list_like(loc):
1630+
loc = lib.maybe_indices_to_slice(com._ensure_int64(np.array(loc)))
1631+
if isinstance(loc, slice) and loc.step in (1, None):
1632+
if (loc.start in (0, None) or loc.stop in (len(self), None)):
1633+
freq = self.freq
1634+
1635+
if self.tz is not None:
1636+
new_dates = tslib.date_normalize(new_dates, self.tz)
1637+
return DatetimeIndex(new_dates, name=self.name, freq=freq, tz=self.tz)
1638+
16111639
def _view_like(self, ndarray):
16121640
result = ndarray.view(type(self))
16131641
result.offset = self.offset

pandas/tseries/tests/test_timeseries.py

+65-16
Original file line numberDiff line numberDiff line change
@@ -2293,33 +2293,82 @@ def test_insert(self):
22932293
self.assertEqual(result.freqstr, 'M')
22942294

22952295
def test_delete(self):
2296-
idx = date_range(start='2000-01-01', periods=4, freq='M', name='idx')
2296+
idx = date_range(start='2000-01-01', periods=5, freq='M', name='idx')
22972297

2298-
expected = date_range(start='2000-02-01', periods=3, freq='M', name='idx')
2299-
result = idx.delete(0)
2300-
self.assertTrue(result.equals(expected))
2301-
self.assertEqual(result.name, expected.name)
2302-
self.assertEqual(result.freqstr, 'M')
2298+
# prserve freq
2299+
expected_0 = date_range(start='2000-02-01', periods=4, freq='M', name='idx')
2300+
expected_4 = date_range(start='2000-01-01', periods=4, freq='M', name='idx')
23032301

2304-
expected = date_range(start='2000-01-01', periods=3, freq='M', name='idx')
2305-
result = idx.delete(-1)
2306-
self.assertTrue(result.equals(expected))
2307-
self.assertEqual(result.name, expected.name)
2308-
self.assertEqual(result.freqstr, 'M')
2302+
# reset freq to None
2303+
expected_1 = DatetimeIndex(['2000-01-31', '2000-03-31', '2000-04-30',
2304+
'2000-05-31'], freq=None, name='idx')
2305+
2306+
cases ={0: expected_0, -5: expected_0,
2307+
-1: expected_4, 4: expected_4,
2308+
1: expected_1}
2309+
for n, expected in compat.iteritems(cases):
2310+
result = idx.delete(n)
2311+
self.assertTrue(result.equals(expected))
2312+
self.assertEqual(result.name, expected.name)
2313+
self.assertEqual(result.freq, expected.freq)
23092314

23102315
with tm.assertRaises((IndexError, ValueError)):
23112316
# either depeidnig on numpy version
23122317
result = idx.delete(5)
23132318

2314-
idx = date_range(start='2000-01-01', periods=4,
2315-
freq='M', name='idx', tz='US/Pacific')
2319+
idx = date_range(start='2000-01-01', periods=5,
2320+
freq='D', name='idx', tz='US/Pacific')
23162321

2317-
expected = date_range(start='2000-02-01', periods=3,
2318-
freq='M', name='idx', tz='US/Pacific')
2322+
expected = date_range(start='2000-01-02', periods=4,
2323+
freq='D', name='idx', tz='US/Pacific')
23192324
result = idx.delete(0)
23202325
self.assertTrue(result.equals(expected))
23212326
self.assertEqual(result.name, expected.name)
2322-
self.assertEqual(result.freqstr, 'M')
2327+
self.assertEqual(result.freqstr, 'D')
2328+
self.assertEqual(result.tz, expected.tz)
2329+
2330+
def test_delete_slice(self):
2331+
idx = date_range(start='2000-01-01', periods=10, freq='D', name='idx')
2332+
2333+
# prserve freq
2334+
expected_0_2 = date_range(start='2000-01-04', periods=7, freq='D', name='idx')
2335+
expected_7_9 = date_range(start='2000-01-01', periods=7, freq='D', name='idx')
2336+
2337+
# reset freq to None
2338+
expected_3_5 = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03',
2339+
'2000-01-07', '2000-01-08', '2000-01-09',
2340+
'2000-01-10'], freq=None, name='idx')
2341+
2342+
cases ={(0, 1, 2): expected_0_2,
2343+
(7, 8, 9): expected_7_9,
2344+
(3, 4, 5): expected_3_5}
2345+
for n, expected in compat.iteritems(cases):
2346+
result = idx.delete(n)
2347+
self.assertTrue(result.equals(expected))
2348+
self.assertEqual(result.name, expected.name)
2349+
self.assertEqual(result.freq, expected.freq)
2350+
2351+
result = idx.delete(slice(n[0], n[-1] + 1))
2352+
self.assertTrue(result.equals(expected))
2353+
self.assertEqual(result.name, expected.name)
2354+
self.assertEqual(result.freq, expected.freq)
2355+
2356+
ts = pd.Series(1, index=pd.date_range('2000-01-01', periods=10,
2357+
freq='D', name='idx'))
2358+
# preserve freq
2359+
result = ts.drop(ts.index[:5]).index
2360+
expected = pd.date_range('2000-01-06', periods=5, freq='D', name='idx')
2361+
self.assertTrue(result.equals(expected))
2362+
self.assertEqual(result.name, expected.name)
2363+
self.assertEqual(result.freq, expected.freq)
2364+
2365+
# reset freq to None
2366+
result = ts.drop(ts.index[[1, 3, 5, 7, 9]]).index
2367+
expected = DatetimeIndex(['2000-01-01', '2000-01-03', '2000-01-05',
2368+
'2000-01-07', '2000-01-09'], freq=None, name='idx')
2369+
self.assertTrue(result.equals(expected))
2370+
self.assertEqual(result.name, expected.name)
2371+
self.assertEqual(result.freq, expected.freq)
23232372

23242373
def test_map_bug_1677(self):
23252374
index = DatetimeIndex(['2012-04-25 09:30:00.393000'])

0 commit comments

Comments
 (0)