diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index f76f952c53d1d..729d4e4059595 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -154,7 +154,7 @@ def factorize(values, sort=False, order=None, na_sentinel=-1): uniques = uniques.take(sorter) if is_datetime: - uniques = uniques.view('M8[ns]') + uniques = uniques.astype('M8[ns]') if isinstance(values, PeriodIndex): uniques = PeriodIndex(ordinal=uniques, freq=values.freq) @@ -279,6 +279,7 @@ def rank(values, axis=0, method='average', na_option='keep', f, values = _get_data_algo(values, _rank2d_functions) ranks = f(values, axis=axis, ties_method=method, ascending=ascending, na_option=na_option) + return ranks @@ -364,12 +365,22 @@ def _interpolate(a, b, fraction): def _get_data_algo(values, func_map): + mask = None if com.is_float_dtype(values): f = func_map['float64'] values = com._ensure_float64(values) elif com.is_datetime64_dtype(values): - f = func_map['int64'] - values = values.view('i8') + + # if we have NaT, punt to object dtype + mask = com.isnull(values) + if mask.ravel().any(): + f = func_map['generic'] + values = com._ensure_object(values) + values[mask] = np.nan + else: + f = func_map['int64'] + values = values.view('i8') + elif com.is_integer_dtype(values): f = func_map['int64'] values = com._ensure_int64(values) diff --git a/pandas/core/array.py b/pandas/core/array.py index f267771bb770f..495f231921a19 100644 --- a/pandas/core/array.py +++ b/pandas/core/array.py @@ -35,18 +35,3 @@ NA = np.nan -# a series-like ndarray #### - - -class SNDArray(Array): - - def __new__(cls, data, index=None, name=None): - data = data.view(SNDArray) - data.index = index - data.name = name - - return data - - @property - def values(self): - return self.view(Array) diff --git a/pandas/core/common.py b/pandas/core/common.py index 3cedc37533e0c..30ce5166b71e7 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -8,6 +8,7 @@ import codecs import csv import types +from datetime import datetime, timedelta from numpy.lib.format import read_array, write_array import numpy as np @@ -39,7 +40,7 @@ class AmbiguousIndexError(PandasError, KeyError): pass -_POSSIBLY_CAST_DTYPES = set([np.dtype(t) +_POSSIBLY_CAST_DTYPES = set([np.dtype(t).name for t in ['M8[ns]', '>M8[ns]', 'm8[ns]', '= 1.7 required') class TestIndex(tm.TestCase): _multiprocess_can_split_ = True @@ -236,12 +240,7 @@ def test_asof(self): tm.assert_isinstance(self.dateIndex.asof(d), Timestamp) def test_nanosecond_index_access(self): - if _np_version_under1p7: - import nose - - raise nose.SkipTest('numpy >= 1.7 required') - - from pandas import Series, Timestamp, DatetimeIndex + _skip_if_need_numpy_1_7() s = Series([Timestamp('20130101')]).values.view('i8')[0] r = DatetimeIndex([s + 50 + i for i in range(100)]) @@ -1607,11 +1606,12 @@ def test_get_level_values_na(self): expected = ['a', np.nan, 1] assert_array_equal(values.values, expected) - arrays = [['a', 'b', 'b'], pd.DatetimeIndex([0, 1, pd.NaT])] - index = pd.MultiIndex.from_arrays(arrays) - values = index.get_level_values(1) - expected = pd.DatetimeIndex([0, 1, pd.NaT]) - assert_array_equal(values.values, expected.values) + if not _np_version_under1p7: + arrays = [['a', 'b', 'b'], pd.DatetimeIndex([0, 1, pd.NaT])] + index = pd.MultiIndex.from_arrays(arrays) + values = index.get_level_values(1) + expected = pd.DatetimeIndex([0, 1, pd.NaT]) + assert_array_equal(values.values, expected.values) arrays = [[], []] index = pd.MultiIndex.from_arrays(arrays)