8000 API: to_datetime, required unit with numerical (#15836) · pandas-dev/pandas@8e56980 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8e56980

Browse files
author
Anthony Delannoy
committed
API: to_datetime, required unit with numerical (#15836)
* add test_to_datetime_numerical_input * check arg for numerical type
1 parent e50d397 commit 8e56980

File tree

2 files changed

+36
-20
lines changed

2 files changed

+36
-20
lines changed

pandas/tests/indexes/datetimes/test_tools.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -310,21 +310,22 @@ def test_to_datetime_tz_psycopg2(self):
310310
def test_datetime_bool(self):
311311
# GH13176
312312
with self.assertRaises(TypeError):
313-
to_datetime(False)
314-
self.assertTrue(to_datetime(False, errors="coerce") is NaT)
315-
self.assertEqual(to_datetime(False, errors="ignore"), False)
313+
to_datetime(False, unit='ns')
314+
self.assertTrue(to_datetime(False, unit='ns', errors="coerce") is NaT)
315+
self.assertEqual(to_datetime(False, unit='ns', errors="ignore"), False)
316316
with self.assertRaises(TypeError):
317-
to_datetime(True)
318-
self.assertTrue(to_datetime(True, errors="coerce") is NaT)
319-
self.assertEqual(to_datetime(True, errors="ignore"), True)
317+
to_datetime(True, unit='ns')
318+
self.assertTrue(to_datetime(True, unit='ns', errors="coerce") is NaT)
319+
self.assertEqual(to_datetime(True, unit='ns', errors="ignore"), True)
320320
with self.assertRaises(TypeError):
321-
to_datetime([False, datetime.today()])
321+
to_datetime([False, datetime.today()], unit='ns')
322322
with self.assertRaises(TypeError):
323-
to_datetime(['20130101', True])
323+
to_datetime(['20130101', True], unit='ns')
324324
tm.assert_index_equal(to_datetime([0, False, NaT, 0.0],
325+
unit='ns',
325326
errors="coerce"),
326-
DatetimeIndex([to_datetime(0), NaT,
327-
NaT, to_datetime(0)]))
327+
DatetimeIndex([to_datetime(0, unit='ns'), NaT,
328+
NaT, to_datetime(0, unit='ns')]))
328329

329330
def test_datetime_invalid_datatype(self):
330331
# GH13176
@@ -410,10 +411,10 @@ def test_unit_with_numeric(self):
410411
arr1 = [1.434692e+18, 1.432766e+18]
411412
arr2 = np.array(arr1).astype('int64')
412413
for errors in ['ignore', 'raise', 'coerce']:
413-
result = pd.to_datetime(arr1, errors=errors)
414+
result = pd.to_datetime(arr1, unit='ns', errors=errors)
414415
tm.assert_index_equal(result, expected)
415416

416-
result = pd.to_datetime(arr2, errors=errors)
417+
result = pd.to_datetime(arr2, unit='ns', errors=errors)
417418
tm.assert_index_equal(result, expected)
418419

419420
# but we want to make sure that we are coercing
@@ -422,15 +423,15 @@ def test_unit_with_numeric(self):
422423
'2015-06-19 05:33:20',
423424
'2015-05-27 22:33:20'])
424425
arr = ['foo', 1.434692e+18, 1.432766e+18]
425-
result = pd.to_datetime(arr, errors='coerce')
426+
result = pd.to_datetime(arr, unit='ns', errors='coerce')
426427
tm.assert_index_equal(result, expected)
427428

428429
expected = DatetimeIndex(['2015-06-19 05:33:20',
429430
'2015-05-27 22:33:20',
430431
'NaT',
431432
'NaT'])
432433
arr = [1.434692e+18, 1.432766e+18, 'foo', 'NaT']
433-
result = pd.to_datetime(arr, errors='coerce')
434+
result = pd.to_datetime(arr, unit='ns', errors='coerce')
434435
tm.assert_index_equal(result, expected)
435436

436437
def test_unit_mixed(self):
@@ -442,17 +443,17 @@ def test_unit_mixed(self):
442443
tm.assert_index_equal(result, expected)
443444

444445
with self.assertRaises(ValueError):
445-
pd.to_datetime(arr, errors='raise')
446+
pd.to_datetime(arr, unit='ns', errors='raise')
446447

447448
expected = DatetimeIndex(['NaT',
448449
'NaT',
449450
'2013-01-01'])
450451
arr = [1.434692e+18, 1.432766e+18, pd.Timestamp('20130101')]
451-
result = pd.to_datetime(arr, errors='coerce')
452+
result = pd.to_datetime(arr, unit='ns', errors='coerce')
452453
tm.assert_index_equal(result, expected)
453454

454455
with self.assertRaises(ValueError):
455-
pd.to_datetime(arr, errors='raise')
456+
pd.to_datetime(arr, unit='ns', errors='raise')
456457

457458
def test_dataframe(self):
458459

@@ -688,7 +689,7 @@ def test_to_datetime_types(self):
688689

689690
# ints
690691
result = Timestamp(0)
691-
expected = to_datetime(0)
692+
expected = to_datetime(0, unit='ns')
692693
self.assertEqual(result, expected)
693694

694695
# GH 3888 (strings)
@@ -715,6 +716,14 @@ def test_to_datetime_unprocessable_input(self):
715716
)
716717
self.assertRaises(TypeError, to_datetime, [1, '1'], errors='raise')
717718

719+
@pytest.mark.parametrize('arg', [int(1), float(1), range(5),
720+
np.array(range(5), 'd')])
721+
@staticmethod
722+
def test_to_datetime_numerical_input(arg):
723+
# GH15836
724+
with pytest.raises(ValueError):
725+
pd.to_datetime(arg)
726+
718727
def test_to_datetime_other_datetime64_units(self):
719728
# 5/25/2012
720729
scalar = np.int64(1337904000000000).view('M8[us]')

pandas/tseries/tools.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -434,9 +434,17 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
434434
except (ValueError, TypeError):
435435
raise e
436436

437+
def check_numerical_arg():
438+
return ((is_scalar(arg) and (is_integer(arg) or is_float(arg))) or
439+
is_numeric_dtype(np.asarray(arg)))
440+
437441
if arg is None:
438442
return None
439443

444+
if unit is None and format is None:
445+
if check_numerical_arg():
446+
raise ValueError("a unit is required in case of numerical arg")
447+
440448
# handle origin
441449
if origin == 'julian':
442450

@@ -462,8 +470,7 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
462470

463471
# arg must be a numeric
464472
original = arg
465-
if not ((is_scalar(arg) and (is_integer(arg) or is_float(arg))) or
466-
is_numeric_dtype(np.asarray(arg))):
473+
if not check_numerical_arg():
467474
raise ValueError(
468475
"'{arg}' is not compatible with origin='{origin}'; "
469476
"it must be numeric with a unit specified ".format(

0 commit comments

Comments
 (0)
0