Skip to content

Commit 358a334

Browse files
committed
COMPAT: numpy compat with NaT != NaT, #12049
1 parent 1945eed commit 358a334

File tree

4 files changed

+55
-24
lines changed

4 files changed

+55
-24
lines changed

doc/source/whatsnew/v0.18.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ Bug Fixes
445445
- Accept unicode in ``Timedelta`` constructor (:issue:`11995`)
446446
- Bug in value label reading for ``StataReader`` when reading incrementally (:issue:`12014`)
447447
- Bug in vectorized ``DateOffset`` when ``n`` parameter is ``0`` (:issue:`11370`)
448-
448+
- Compat for numpy 1.11 w.r.t. ``NaT`` comparison changes (:issue:`12049`)
449449

450450

451451

pandas/core/common.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -379,12 +379,13 @@ def array_equivalent(left, right, strict_nan=False):
379379
"""
380380

381381
left, right = np.asarray(left), np.asarray(right)
382+
383+
# shape compat
382384
if left.shape != right.shape:
383385
return False
384386

385387
# Object arrays can contain None, NaN and NaT.
386-
if (issubclass(left.dtype.type, np.object_) or
387-
issubclass(right.dtype.type, np.object_)):
388+
if is_object_dtype(left) or is_object_dtype(right):
388389

389390
if not strict_nan:
390391
# pd.isnull considers NaN and None to be equivalent.
@@ -405,13 +406,21 @@ def array_equivalent(left, right, strict_nan=False):
405406
return True
406407

407408
# NaNs can occur in float and complex arrays.
408-
if issubclass(left.dtype.type, (np.floating, np.complexfloating)):
409+
if is_float_dtype(left) or is_complex_dtype(left):
409410
return ((left == right) | (np.isnan(left) & np.isnan(right))).all()
410411

411412
# numpy will will not allow this type of datetimelike vs integer comparison
412413
elif is_datetimelike_v_numeric(left, right):
413414
return False
414415

416+
# M8/m8
417+
elif needs_i8_conversion(left) and needs_i8_conversion(right):
418+
if not is_dtype_equal(left.dtype, right.dtype):
419+
return False
420+
421+
left = left.view('i8')
422+
right = right.view('i8')
423+
415424
# NaNs cannot occur otherwise.
416425
return np.array_equal(left, right)
417426

pandas/tests/test_common.py

+33-11
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import numpy as np
99
import pandas as pd
1010
from pandas.tslib import iNaT, NaT
11-
from pandas import Series, DataFrame, date_range, DatetimeIndex, Timestamp, Float64Index
11+
from pandas import (Series, DataFrame, date_range,
12+
DatetimeIndex, TimedeltaIndex,
13+
Timestamp, Float64Index)
1214
from pandas import compat
1315
from pandas.compat import range, long, lrange, lmap, u
1416
from pandas.core.common import notnull, isnull, array_equivalent
@@ -322,20 +324,40 @@ def test_array_equivalent():
322324
np.array([np.nan, 1, np.nan]))
323325
assert array_equivalent(np.array([np.nan, None], dtype='object'),
324326
np.array([np.nan, None], dtype='object'))
325-
assert array_equivalent(np.array([np.nan, 1+1j], dtype='complex'),
326-
np.array([np.nan, 1+1j], dtype='complex'))
327-
assert not array_equivalent(np.array([np.nan, 1+1j], dtype='complex'),
328-
np.array([np.nan, 1+2j], dtype='complex'))
327+
assert array_equivalent(np.array([np.nan, 1 + 1j], dtype='complex'),
328+
np.array([np.nan, 1 + 1j], dtype='complex'))
329+
assert not array_equivalent(np.array([np.nan, 1 + 1j], dtype='complex'),
330+
np.array([np.nan, 1 + 2j], dtype='complex'))
329331
assert not array_equivalent(np.array([np.nan, 1, np.nan]),
330332
np.array([np.nan, 2, np.nan]))
331-
assert not array_equivalent(np.array(['a', 'b', 'c', 'd']), np.array(['e', 'e']))
332-
assert array_equivalent(Float64Index([0, np.nan]), Float64Index([0, np.nan]))
333-
assert not array_equivalent(Float64Index([0, np.nan]), Float64Index([1, np.nan]))
334-
assert array_equivalent(DatetimeIndex([0, np.nan]), DatetimeIndex([0, np.nan]))
335-
assert not array_equivalent(DatetimeIndex([0, np.nan]), DatetimeIndex([1, np.nan]))
333+
assert not array_equivalent(np.array(['a', 'b', 'c', 'd']),
334+
np.array(['e', 'e']))
335+
assert array_equivalent(Float64Index([0, np.nan]),
336+
Float64Index([0, np.nan]))
337+
assert not array_equivalent(Float64Index([0, np.nan]),
338+
Float64Index([1, np.nan]))
339+
assert array_equivalent(DatetimeIndex([0, np.nan]),
340+
DatetimeIndex([0, np.nan]))
341+
assert not array_equivalent(DatetimeIndex([0, np.nan]),
342+
DatetimeIndex([1, np.nan]))
343+
assert array_equivalent(TimedeltaIndex([0, np.nan]),
344+
TimedeltaIndex([0, np.nan]))
345+
assert not array_equivalent(TimedeltaIndex([0, np.nan]),
346+
TimedeltaIndex([1, np.nan]))
347+
assert array_equivalent(DatetimeIndex([0, np.nan], tz='US/Eastern'),
348+
DatetimeIndex([0, np.nan], tz='US/Eastern'))
349+
assert not array_equivalent(DatetimeIndex([0, np.nan], tz='US/Eastern'),
350+
DatetimeIndex([1, np.nan], tz='US/Eastern'))
351+
assert not array_equivalent(DatetimeIndex([0, np.nan]),
352+
DatetimeIndex([0, np.nan], tz='US/Eastern'))
353+
assert not array_equivalent(DatetimeIndex([0, np.nan], tz='CET'),
354+
DatetimeIndex([0, np.nan], tz='US/Eastern'))
355+
assert not array_equivalent(DatetimeIndex([0, np.nan]),
356+
TimedeltaIndex([0, np.nan]))
357+
336358

337359
def test_datetimeindex_from_empty_datetime64_array():
338-
for unit in [ 'ms', 'us', 'ns' ]:
360+
for unit in ['ms', 'us', 'ns']:
339361
idx = DatetimeIndex(np.array([], dtype='datetime64[%s]' % unit))
340362
assert(len(idx) == 0)
341363

pandas/tseries/tests/test_tslib.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -399,8 +399,10 @@ def test_asm8(self):
399399
1000,
400400
]
401401
for n in ns:
402-
self.assertEqual(Timestamp(n).asm8, np.datetime64(n, 'ns'), n)
403-
self.assertEqual(Timestamp('nat').asm8, np.datetime64('nat', 'ns'))
402+
self.assertEqual(Timestamp(n).asm8.view('i8'),
403+
np.datetime64(n, 'ns').view('i8'), n)
404+
self.assertEqual(Timestamp('nat').asm8.view('i8'),
405+
np.datetime64('nat', 'ns').view('i8'))
404406

405407
def test_fields(self):
406408

@@ -752,13 +754,11 @@ def test_coercing_dates_outside_of_datetime64_ns_bounds(self):
752754
np.array([invalid_date], dtype='object'),
753755
errors='raise',
754756
)
755-
self.assertTrue(
756-
np.array_equal(
757-
tslib.array_to_datetime(
758-
np.array([invalid_date], dtype='object'), errors='coerce',
759-
),
760-
np.array([tslib.iNaT], dtype='M8[ns]')
761-
)
757+
self.assert_numpy_array_equal(
758+
tslib.array_to_datetime(
759+
np.array([invalid_date], dtype='object'),
760+
errors='coerce'),
761+
np.array([tslib.iNaT], dtype='M8[ns]')
762762
)
763763

764764
arr = np.array(['1/1/1000', '1/1/2000'], dtype=object)

0 commit comments

Comments
 (0)