Skip to content

Commit a1387ad

Browse files
committed
NA Compat
1 parent 9a68c3a commit a1387ad

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

pandas/core/indexes/interval.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -981,16 +981,20 @@ def delete(self, loc):
981981

982982
def insert(self, loc, item):
983983
if isinstance(item, Interval):
984-
if not item.closed == self.closed:
984+
if item.closed != self.closed:
985985
raise ValueError('inserted item must be closed on the same '
986986
'side as the index')
987987
left_insert = item.left
988988
right_insert = item.right
989989
elif is_scalar(item) and isna(item):
990990
# GH 18295
991+
if item is not self.left._na_value:
992+
raise TypeError('cannot insert with incompatible NA value: '
993+
'got {item}, expected {na}'
994+
.format(item=item, na=self.left._na_value))
991995
left_insert = right_insert = item
992996
else:
993-
raise ValueError('can only insert Interval objects and NaN into '
997+
raise ValueError('can only insert Interval objects and NA into '
994998
'an IntervalIndex')
995999

9961000
new_left = self.left.insert(loc, left_insert)

pandas/tests/indexes/test_interval.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,30 @@ def test_insert(self):
318318
pytest.raises(ValueError, self.index.insert, 0,
319319
Interval(2, 3, closed='left'))
320320

321+
@pytest.mark.parametrize('data', [
322+
interval_range(0, periods=10),
323+
interval_range(1.7, periods=8, freq=2.5),
324+
interval_range(Timestamp('20170101'), periods=12),
325+
interval_range(Timedelta('1 day'), periods=6),
326+
IntervalIndex.from_tuples([('a', 'd'), ('e', 'j'), ('w', 'z')]),
327+
IntervalIndex.from_tuples([(1, 2), ('a', 'z'), (3.14, 6.28)])])
328+
def test_insert_na(self, data):
321329
# GH 18295
322-
expected = self.index_with_nan
323-
result = self.index.insert(1, np.nan)
330+
valid_na, invalid_na = np.nan, pd.NaT
331+
if data.left._na_value is pd.NaT:
332+
valid_na, invalid_na = invalid_na, valid_na
333+
334+
# valid insertion
335+
expected = IntervalIndex([data[0], np.nan]).append(data[1:])
336+
result = data.insert(1, valid_na)
324337
tm.assert_index_equal(result, expected)
325338

339+
# invalid insertion
340+
msg = ('cannot insert with incompatible NA value: got {invalid}, '
341+
'expected {valid}').format(invalid=invalid_na, valid=valid_na)
342+
with tm.assert_raises_regex(TypeError, msg):
343+
data.insert(1, invalid_na)
344+
326345
def test_take(self, closed):
327346
index = self.create_index(closed=closed)
328347

0 commit comments

Comments
 (0)