def to_datetime(arg, errors='ignore', dayfirst=False): """ Convert argument to datetime Parameters ---------- arg : string, datetime, array of strings (with possible NAs) errors : {'ignore', 'raise'}, default 'ignore' Errors are ignored by default (values left untouched) Returns ------- ret : datetime if parsing succeeded """ from pandas.core.series import Series from pandas.tseries.index import DatetimeIndex if arg is None: return arg elif isinstance(arg, datetime): return arg elif isinstance(arg, Series): values = lib.string_to_datetime(com._ensure_object(arg.values), raise_=errors == 'raise', dayfirst=dayfirst) return Series(values, index=arg.index, name=arg.name) elif isinstance(arg, (np.ndarray, list)): if isinstance(arg, list): arg = np.array(arg, dtype='O') result = lib.string_to_datetime(com._ensure_object(arg), raise_=errors == 'raise', dayfirst=dayfirst) if com.is_datetime64_dtype(result): result = DatetimeIndex(result) return result try: if not arg: return arg return _dtparser.parse(arg, dayfirst=dayfirst) except Exception: if errors == 'raise': raise return arg
def test_string_na_nat_conversion(self): # GH #999, #858 from dateutil.parser import parse from pandas.core.datetools import to_datetime strings = np.array(['1/1/2000', '1/2/2000', np.nan, '1/4/2000, 12:34:56'], dtype=object) expected = np.empty(4, dtype='M8') for i, val in enumerate(strings): if com.isnull(val): expected[i] = NaT else: expected[i] = parse(val) result = lib.string_to_datetime(strings) assert_almost_equal(result, expected) result2 = to_datetime(strings) assert_almost_equal(result, result2) malformed = np.array(['1/100/2000', np.nan], dtype=object) result = to_datetime(malformed) assert_almost_equal(result, malformed) self.assertRaises(ValueError, to_datetime, malformed, errors='raise') idx = ['a', 'b', 'c', 'd', 'e'] series = Series(['1/1/2000', np.nan, '1/3/2000', np.nan, '1/5/2000'], index=idx, name='foo') dseries = Series([to_datetime('1/1/2000'), np.nan, to_datetime('1/3/2000'), np.nan, to_datetime('1/5/2000')], index=idx, name='foo') result = to_datetime(series) dresult = to_datetime(dseries) expected = Series(np.empty(5, dtype='M8[us]'), index=idx) for i in range(5): x = series[i] if isnull(x): expected[i] = NaT else: expected[i] = to_datetime(x) assert_series_equal(result, expected) self.assertEquals(result.name, 'foo') assert_series_equal(dresult, expected) self.assertEquals(dresult.name, 'foo')
def test_string_na_nat_conversion(self): # GH #999, #858 from dateutil.parser import parse strings = np.array(["1/1/2000", "1/2/2000", np.nan, "1/4/2000, 12:34:56"], dtype=object) expected = np.empty(4, dtype="M8") for i, val in enumerate(strings): if com.isnull(val): expected[i] = NaT else: expected[i] = parse(val) result = lib.string_to_datetime(strings) assert_almost_equal(result, expected) result2 = to_datetime(strings) assert_almost_equal(result, result2) malformed = np.array(["1/100/2000", np.nan], dtype=object) result = to_datetime(malformed) assert_almost_equal(result, malformed) self.assertRaises(ValueError, to_datetime, malformed, errors="raise") idx = ["a", "b", "c", "d", "e"] series = Series(["1/1/2000", np.nan, "1/3/2000", np.nan, "1/5/2000"], index=idx, name="foo") dseries = Series( [to_datetime("1/1/2000"), np.nan, to_datetime("1/3/2000"), np.nan, to_datetime("1/5/2000")], index=idx, name="foo", ) result = to_datetime(series) dresult = to_datetime(dseries) expected = Series(np.empty(5, dtype="M8[us]"), index=idx) for i in range(5): x = series[i] if isnull(x): expected[i] = NaT else: expected[i] = to_datetime(x) assert_series_equal(result, expected) self.assertEquals(result.name, "foo") assert_series_equal(dresult, expected) self.assertEquals(dresult.name, "foo")