diff --git a/doc/source/whatsnew/v0.16.0.txt b/doc/source/whatsnew/v0.16.0.txt index 18c55e38ab7af..01e6170413187 100644 --- a/doc/source/whatsnew/v0.16.0.txt +++ b/doc/source/whatsnew/v0.16.0.txt @@ -101,6 +101,7 @@ Enhancements - Added ``Timestamp.to_datetime64()`` to complement ``Timedelta.to_timedelta64()`` (:issue:`9255`) - ``tseries.frequencies.to_offset()`` now accepts ``Timedelta`` as input (:issue:`9064`) +- ``Timedelta`` will now accept nanoseconds keyword in constructor (:issue:`9273`) Performance ~~~~~~~~~~~ diff --git a/pandas/tseries/tests/test_timedeltas.py b/pandas/tseries/tests/test_timedeltas.py index ced566157d48f..9442dc3b6b6e7 100644 --- a/pandas/tseries/tests/test_timedeltas.py +++ b/pandas/tseries/tests/test_timedeltas.py @@ -683,6 +683,30 @@ def test_to_timedelta_on_missing_values(self): actual = pd.to_timedelta(pd.NaT) self.assertEqual(actual.value, timedelta_NaT.astype('int64')) + def test_to_timedelta_on_nanoseconds(self): + # GH 9273 + result = Timedelta(nanoseconds=100) + expected = Timedelta('100ns') + self.assertEqual(result, expected) + + result = Timedelta(days=1,hours=1,minutes=1,weeks=1,seconds=1,milliseconds=1,microseconds=1,nanoseconds=1) + expected = Timedelta(694861001001001) + self.assertEqual(result, expected) + + result = Timedelta(microseconds=1) + Timedelta(nanoseconds=1) + expected = Timedelta('1us1ns') + self.assertEqual(result, expected) + + result = Timedelta(microseconds=1) - Timedelta(nanoseconds=1) + expected = Timedelta('999ns') + self.assertEqual(result, expected) + + result = Timedelta(microseconds=1) + 5*Timedelta(nanoseconds=-2) + expected = Timedelta('990ns') + self.assertEqual(result, expected) + + self.assertRaises(TypeError, lambda: Timedelta(nanoseconds='abc')) + def test_timedelta_ops_with_missing_values(self): # setup s1 = pd.to_timedelta(Series(['00:00:01'])) diff --git a/pandas/tslib.pyx b/pandas/tslib.pyx index 8e2cb199214cf..8217c4b31b287 100644 --- a/pandas/tslib.pyx +++ b/pandas/tslib.pyx @@ -1722,10 +1722,11 @@ class Timedelta(_Timedelta): kwargs = dict([ (k, _to_py_int_float(v)) for k, v in iteritems(kwargs) ]) try: - value = timedelta(**kwargs) + nano = kwargs.pop('nanoseconds',0) + value = convert_to_timedelta64(timedelta(**kwargs),'ns',False) + nano except TypeError as e: raise ValueError("cannot construct a TimeDelta from the passed arguments, allowed keywords are " - "[days, seconds, microseconds, milliseconds, minutes, hours, weeks]") + "[weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds]") if isinstance(value, Timedelta): value = value.value