Skip to content

Commit 237766c

Browse files
committed
NA Compat
1 parent 3c933ad commit 237766c

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

pandas/core/indexes/interval.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -980,16 +980,20 @@ def delete(self, loc):
980980

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

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

pandas/tests/indexes/test_interval.py

+21-2
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,30 @@ def test_insert(self):
255255
pytest.raises(ValueError, self.index.insert, 0,
256256
Interval(2, 3, closed='left'))
257257

258+
@pytest.mark.parametrize('data', [
259+
interval_range(0, periods=10),
260+
interval_range(1.7, periods=8, freq=2.5),
261+
interval_range(Timestamp('20170101'), periods=12),
262+
interval_range(Timedelta('1 day'), periods=6),
263+
IntervalIndex.from_tuples([('a', 'd'), ('e', 'j'), ('w', 'z')]),
264+
IntervalIndex.from_tuples([(1, 2), ('a', 'z'), (3.14, 6.28)])])
265+
def test_insert_na(self, data):
258266
# GH 18295
259-
expected = self.index_with_nan
260-
result = self.index.insert(1, np.nan)
267+
valid_na, invalid_na = np.nan, pd.NaT
268+
if data.left._na_value is pd.NaT:
269+
valid_na, invalid_na = invalid_na, valid_na
270+
271+
# valid insertion
272+
expected = IntervalIndex([data[0], np.nan]).append(data[1:])
273+
result = data.insert(1, valid_na)
261274
tm.assert_index_equal(result, expected)
262275

276+
# invalid insertion
277+
msg = ('cannot insert with incompatible NA value: got {invalid}, '
278+
'expected {valid}').format(invalid=invalid_na, valid=valid_na)
279+
with tm.assert_raises_regex(TypeError, msg):
280+
data.insert(1, invalid_na)
281+
263282
def test_take(self):
264283
actual = self.index.take([0, 1])
265284
assert self.index.equals(actual)

0 commit comments

Comments
 (0)