{"record":{"id":"07be9a46f91b0247","repo":"pola-rs/polars","slug":"invalid-interval-unit-for-time-range-found-unit","errorCode":null,"errorMessage":"invalid interval unit for time_range: found {unit!r}","messagePattern":"invalid interval unit for time_range: found (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/functions/range/time_range.py","lineNumber":137,"sourceCode":"    >>> pl.time_range(\n    ...     start=time(14, 0),\n    ...     interval=timedelta(hours=3, minutes=15),\n    ...     eager=True,\n    ... ).alias(\"time\")\n    shape: (4,)\n    Series: 'time' [time]\n    [\n        14:00:00\n        17:15:00\n        20:30:00\n        23:45:00\n    ]\n    \"\"\"\n    interval = parse_interval_argument(interval)\n    for unit in (\"y\", \"mo\", \"w\", \"d\"):\n        if unit in interval:\n            msg = f\"invalid interval unit for time_range: found {unit!r}\"\n            raise ValueError(msg)\n\n    if start is None:\n        start = time(0, 0, 0)\n    if end is None:\n        end = time(23, 59, 59, 999999)\n\n    start_pyexpr = parse_into_expression(start)\n    end_pyexpr = parse_into_expression(end)\n\n    result = wrap_expr(plr.time_range(start_pyexpr, end_pyexpr, interval, closed))\n\n    if eager:\n        return F.select(result).to_series()\n\n    return result\n\n\n@overload","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/py-polars/src/polars/functions/range/time_range.py#L119-L155","documentation":"Raised by polars.time_range when the interval string contains a date-scale unit ('y', 'mo', 'w' or 'd'). The time dtype has no date component, so intervals of days or larger are meaningless for it; only sub-day units (h, m, s, ms, us, ns) are valid.","triggerScenarios":"pl.time_range(interval='1d'); pl.time_range('00:00', '23:00', interval='1w'); copying an interval like '1mo' from date_range code; any of 'y', 'mo', 'w', 'd' appearing in the parsed interval string.","commonSituations":"Reusing date_range/datetime_range intervals for time-of-day grids (e.g. building a daily schedule with '1d' instead of '24h'); migrating from pandas date_range(freq='D') on times; configuration files sharing one interval across date and time ranges.","solutions":["Use sub-day units, e.g. interval='24h' or '1h'/'30m'/'15s'/'500ms'","If you actually need dates or datetimes, use pl.date_range or pl.datetime_range instead of time_range","Centralize interval strings per domain so date-scale intervals never reach time_range"],"exampleFix":"// before\npl.time_range(time(0, 0), time(23, 59), interval='1d', eager=True)\n// after\npl.time_range(time(0, 0), time(23, 59), interval='12h', eager=True)\n# or, if day steps were intended:\npl.datetime_range(datetime(2024,1,1), datetime(2024,1,7), interval='1d', eager=True)","handlingStrategy":"validation","validationCode":"INVALID_TIME_UNITS = ('y', 'mo', 'w', 'd')\nif any(u in interval for u in INVALID_TIME_UNITS):\n    raise ValueError(f'time_range interval {interval!r} uses a date-scale unit')","typeGuard":"def is_subday_interval(interval: str) -> bool:\n    return not any(u in interval for u in ('y', 'mo', 'w', 'd'))","tryCatchPattern":"try:\n    s = pl.time_range(start, end, interval=interval, eager=True)\nexcept ValueError:\n    s = pl.datetime_range(..., interval=interval).dt.time","preventionTips":["Keep separate interval constants for time grids vs date grids","Prefer '1h'/'30m' style intervals everywhere for time-of-day data"],"tags":["polars","time-range","interval","argument-validation"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}