Skip to content

Commit 03bbed5

Browse files
committed
Merge pull request #7608 from sinhrks/delete2
BUG: DatetimeIndex.delete with tz raises ValueError
2 parents 161376f + abf8493 commit 03bbed5

File tree

2 files changed

+66
-49
lines changed

2 files changed

+66
-49
lines changed

pandas/tseries/index.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1626,7 +1626,7 @@ def delete(self, loc):
16261626
freq = self.freq
16271627

16281628
if self.tz is not None:
1629-
new_dates = tslib.date_normalize(new_dates, self.tz)
1629+
new_dates = _tz_convert_with_transitions(new_dates, 'UTC', self.tz)
16301630
return DatetimeIndex(new_dates, name=self.name, freq=freq, tz=self.tz)
16311631

16321632
def _view_like(self, ndarray):

pandas/tseries/tests/test_timeseries.py

+65-48
Original file line numberDiff line numberDiff line change
@@ -2455,27 +2455,31 @@ def test_insert(self):
24552455
with tm.assertRaises(ValueError):
24562456
result = idx.insert(3, datetime(2000, 1, 4, tzinfo=pytz.timezone('US/Eastern')))
24572457

2458-
# preserve freq
2459-
expected = date_range('1/1/2000', periods=4, freq='D', tz='Asia/Tokyo', name='idx')
2460-
for d in [pd.Timestamp('2000-01-04', tz='Asia/Tokyo'),
2461-
datetime(2000, 1, 4, tzinfo=pytz.timezone('Asia/Tokyo'))]:
2462-
2463-
result = idx.insert(3, d)
2464-
self.assertTrue(result.equals(expected))
2465-
self.assertEqual(result.name, expected.name)
2466-
self.assertEqual(result.freqstr, expected.freq)
2467-
2468-
expected = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03',
2469-
'2000-01-02'], name='idx',
2470-
tz='Asia/Tokyo', freq=None)
2471-
# reset freq to None
2472-
for d in [pd.Timestamp('2000-01-02', tz='Asia/Tokyo'),
2473-
datetime(2000, 1, 2, tzinfo=pytz.timezone('Asia/Tokyo'))]:
2474-
result = idx.insert(3, d)
2475-
self.assertTrue(result.equals(expected))
2476-
self.assertEqual(result.name, expected.name)
2477-
self.assertTrue(result.freq is None)
2458+
for tz in ['US/Pacific', 'Asia/Singapore']:
2459+
idx = date_range('1/1/2000 09:00', periods=6, freq='H', tz=tz, name='idx')
2460+
# preserve freq
2461+
expected = date_range('1/1/2000 09:00', periods=7, freq='H', tz=tz, name='idx')
2462+
for d in [pd.Timestamp('2000-01-01 15:00', tz=tz),
2463+
pytz.timezone(tz).localize(datetime(2000, 1, 1, 15))]:
2464+
2465+
result = idx.insert(6, d)
2466+
self.assertTrue(result.equals(expected))
2467+
self.assertEqual(result.name, expected.name)
2468+
self.assertEqual(result.freq, expected.freq)
2469+
self.assertEqual(result.tz, expected.tz)
24782470

2471+
expected = DatetimeIndex(['2000-01-01 09:00', '2000-01-01 10:00', '2000-01-01 11:00',
2472+
'2000-01-01 12:00', '2000-01-01 13:00', '2000-01-01 14:00',
2473+
'2000-01-01 10:00'], name='idx',
2474+
tz=tz, freq=None)
2475+
# reset freq to None
2476+
for d in [pd.Timestamp('2000-01-01 10:00', tz=tz),
2477+
pytz.timezone(tz).localize(datetime(2000, 1, 1, 10))]:
2478+
result = idx.insert(6, d)
2479+
self.assertTrue(result.equals(expected))
2480+
self.assertEqual(result.name, expected.name)
2481+
self.assertTrue(result.freq is None)
2482+
self.assertEqual(result.tz, expected.tz)
24792483

24802484
def test_delete(self):
24812485
idx = date_range(start='2000-01-01', periods=5, freq='M', name='idx')
@@ -2501,16 +2505,25 @@ def test_delete(self):
25012505
# either depeidnig on numpy version
25022506
result = idx.delete(5)
25032507

2504-
idx = date_range(start='2000-01-01', periods=5,
2505-
freq='D', name='idx', tz='US/Pacific')
2508+
for tz in [None, 'Asia/Tokyo', 'US/Pacific']:
2509+
idx = date_range(start='2000-01-01 09:00', periods=10,
2510+
freq='H', name='idx', tz=tz)
25062511

2507-
expected = date_range(start='2000-01-02', periods=4,
2508-
freq='D', name='idx', tz='US/Pacific')
2509-
result = idx.delete(0)
2510-
self.assertTrue(result.equals(expected))
2511-
self.assertEqual(result.name, expected.name)
2512-
self.assertEqual(result.freqstr, 'D')
2513-
self.assertEqual(result.tz, expected.tz)
2512+
expected = date_range(start='2000-01-01 10:00', periods=9,
2513+
freq='H', name='idx', tz=tz)
2514+
result = idx.delete(0)
2515+
self.assertTrue(result.equals(expected))
2516+
self.assertEqual(result.name, expected.name)
2517+
self.assertEqual(result.freqstr, 'H')
2518+
self.assertEqual(result.tz, expected.tz)
2519+
2520+
expected = date_range(start='2000-01-01 09:00', periods=9,
2521+
freq='H', name='idx', tz=tz)
2522+
result = idx.delete(-1)
2523+
self.assertTrue(result.equals(expected))
2524+
self.assertEqual(result.name, expected.name)
2525+
self.assertEqual(result.freqstr, 'H')
2526+
self.assertEqual(result.tz, expected.tz)
25142527

25152528
def test_delete_slice(self):
25162529
idx = date_range(start='2000-01-01', periods=10, freq='D', name='idx')
@@ -2538,30 +2551,34 @@ def test_delete_slice(self):
25382551
self.assertEqual(result.name, expected.name)
25392552
self.assertEqual(result.freq, expected.freq)
25402553

2541-
ts = pd.Series(1, index=pd.date_range('2000-01-01', periods=10,
2542-
freq='D', name='idx'))
2543-
# preserve freq
2544-
result = ts.drop(ts.index[:5]).index
2545-
expected = pd.date_range('2000-01-06', periods=5, freq='D', name='idx')
2546-
self.assertTrue(result.equals(expected))
2547-
self.assertEqual(result.name, expected.name)
2548-
self.assertEqual(result.freq, expected.freq)
2554+
for tz in [None, 'Asia/Tokyo', 'US/Pacific']:
2555+
ts = pd.Series(1, index=pd.date_range('2000-01-01 09:00', periods=10,
2556+
freq='H', name='idx', tz=tz))
2557+
# preserve freq
2558+
result = ts.drop(ts.index[:5]).index
2559+
expected = pd.date_range('2000-01-01 14:00', periods=5, freq='H', name='idx', tz=tz)
2560+
self.assertTrue(result.equals(expected))
2561+
self.assertEqual(result.name, expected.name)
2562+
self.assertEqual(result.freq, expected.freq)
2563+
self.assertEqual(result.tz, expected.tz)
25492564

2550-
# reset freq to None
2551-
result = ts.drop(ts.index[[1, 3, 5, 7, 9]]).index
2552-
expected = DatetimeIndex(['2000-01-01', '2000-01-03', '2000-01-05',
2553-
'2000-01-07', '2000-01-09'], freq=None, name='idx')
2554-
self.assertTrue(result.equals(expected))
2555-
self.assertEqual(result.name, expected.name)
2556-
self.assertEqual(result.freq, expected.freq)
2565+
# reset freq to None
2566+
result = ts.drop(ts.index[[1, 3, 5, 7, 9]]).index
2567+
expected = DatetimeIndex(['2000-01-01 09:00', '2000-01-01 11:00', '2000-01-01 13:00',
2568+
'2000-01-01 15:00', '2000-01-01 17:00'],
2569+
freq=None, name='idx', tz=tz)
2570+
self.assertTrue(result.equals(expected))
2571+
self.assertEqual(result.name, expected.name)
2572+
self.assertEqual(result.freq, expected.freq)
2573+
self.assertEqual(result.tz, expected.tz)
25572574

25582575
def test_take(self):
2559-
dates = [datetime(2010, 1, 6), datetime(2010, 1, 7),
2560-
datetime(2010, 1, 9), datetime(2010, 1, 13)]
2576+
dates = [datetime(2010, 1, 1, 14), datetime(2010, 1, 1, 15),
2577+
datetime(2010, 1, 1, 17), datetime(2010, 1, 1, 21)]
25612578

25622579
for tz in [None, 'US/Eastern', 'Asia/Tokyo']:
2563-
idx = DatetimeIndex(start='1/1/10', end='12/31/12',
2564-
freq='D', tz=tz, name='idx')
2580+
idx = DatetimeIndex(start='2010-01-01 09:00', end='2010-02-01 09:00',
2581+
freq='H', tz=tz, name='idx')
25652582
expected = DatetimeIndex(dates, freq=None, name='idx', tz=tz)
25662583

25672584
taken1 = idx.take([5, 6, 8, 12])

0 commit comments

Comments
 (0)