diff --git a/pandas/_libs/tslibs/timedeltas.pyx b/pandas/_libs/tslibs/timedeltas.pyx index 6707d63dab517..d36953052c472 100644 --- a/pandas/_libs/tslibs/timedeltas.pyx +++ b/pandas/_libs/tslibs/timedeltas.pyx @@ -300,6 +300,12 @@ cdef int64_t _numeric_to_td64ns( if is_integer_object(item) and item == NPY_NAT: return NPY_NAT + # Early overflow guard for scalar numeric input + if unit=="ns" and is_integer_object(item): + if item>9223372036854775807 or item <-9223372036854775808: + raise OutOfBoundsTimedelta( + f"Cannot cast {item} from {unit} to 'ns' without overflow." + ) try: ival = cast_from_unit(item, unit, out_reso) except OutOfBoundsDatetime as err: diff --git a/pandas/tests/scalar/timedelta/test_constructors.py b/pandas/tests/scalar/timedelta/test_constructors.py index 38c0de58d5291..c48d74cd515a3 100644 --- a/pandas/tests/scalar/timedelta/test_constructors.py +++ b/pandas/tests/scalar/timedelta/test_constructors.py @@ -3,7 +3,7 @@ import numpy as np import pytest - +import pandas as pd from pandas._libs.tslibs import OutOfBoundsTimedelta from pandas._libs.tslibs.dtypes import NpyDatetimeUnit from pandas.errors import Pandas4Warning @@ -778,3 +778,7 @@ def test_parsed_unit(): # 7 digits after the decimal td = Timedelta("1 Day 2:03:04.0123450") assert td.unit == "ns" +def test_to_timedelta_overflow_raises(): + msg = "Cannot cast .* from ns to 'ns' without overflow" + with pytest.raises(OutOfBoundsTimedelta, match=msg): + pd.to_timedelta(10**20, unit="ns")