From 6ac4d74e003f944b1a8f5bf0862efe51f3b4d134 Mon Sep 17 00:00:00 2001 From: jreback Date: Thu, 10 Apr 2014 07:48:33 -0400 Subject: [PATCH] BUG: to_timedelta not properly converting some units (GH6855) --- pandas/tseries/tests/test_timedeltas.py | 11 +++++++++++ pandas/tseries/timedeltas.py | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/pandas/tseries/tests/test_timedeltas.py b/pandas/tseries/tests/test_timedeltas.py index 628c278aff2e1..57d8bf5623a78 100644 --- a/pandas/tseries/tests/test_timedeltas.py +++ b/pandas/tseries/tests/test_timedeltas.py @@ -199,6 +199,17 @@ def conv(v): expected = Series([ np.timedelta64(1,'D') ]*5) tm.assert_series_equal(result, expected) + # validate all units + # GH 6855 + for unit in ['Y','M','W','D','y','w','d']: + result = to_timedelta(np.arange(5),unit=unit) + expected = Series([ np.timedelta64(i,unit.upper()) for i in np.arange(5).tolist() ]) + tm.assert_series_equal(result, expected) + for unit in ['h','m','s','ms','us','ns','H','S','MS','US','NS']: + result = to_timedelta(np.arange(5),unit=unit) + expected = Series([ np.timedelta64(i,unit.lower()) for i in np.arange(5).tolist() ]) + tm.assert_series_equal(result, expected) + # these will error self.assertRaises(ValueError, lambda : to_timedelta(['1h'])) self.assertRaises(ValueError, lambda : to_timedelta(['1m'])) diff --git a/pandas/tseries/timedeltas.py b/pandas/tseries/timedeltas.py index cc01c26f78b70..0a5693cc55466 100644 --- a/pandas/tseries/timedeltas.py +++ b/pandas/tseries/timedeltas.py @@ -40,6 +40,8 @@ def _convert_listlike(arg, box, unit): if is_timedelta64_dtype(arg): value = arg.astype('timedelta64[ns]') elif is_integer_dtype(arg): + unit = _validate_timedelta_unit(unit) + # these are shortcutable value = arg.astype('timedelta64[{0}]'.format(unit)).astype('timedelta64[ns]') else: @@ -65,6 +67,15 @@ def _convert_listlike(arg, box, unit): # ...so it must be a scalar value. Return scalar. return _coerce_scalar_to_timedelta_type(arg, unit=unit) +def _validate_timedelta_unit(arg): + """ provide validation / translation for timedelta short units """ + + if re.search("Y|W|D",arg,re.IGNORECASE) or arg == 'M': + return arg.upper() + elif re.search("h|m|s|ms|us|ns",arg,re.IGNORECASE): + return arg.lower() + raise ValueError("invalid timedelta unit {0} provided".format(arg)) + _short_search = re.compile( "^\s*(?P-?)\s*(?P\d*\.?\d*)\s*(?Pd|s|ms|us|ns)?\s*$",re.IGNORECASE) _full_search = re.compile(