{"record":{"id":"839875018d8878b9","repo":"pola-rs/polars","slug":"out-of-range-in-duration-conversion","errorCode":null,"errorMessage":"out-of-range in duration conversion","messagePattern":"out-of-range in duration conversion","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/polars-arrow/src/temporal_conversions.rs","lineNumber":85,"sourceCode":"    date64_to_datetime(milliseconds).date()\n}\n\n/// converts a `i32` representing a `time32(s)` to [`NaiveTime`]\n#[inline]\npub fn time32s_to_time(v: i32) -> NaiveTime {\n    NaiveTime::from_num_seconds_from_midnight_opt(v as u32, 0).expect(\"invalid time\")\n}\n\n/// converts a `i64` representing a `duration(s)` to [`Duration`]\n#[inline]\npub fn duration_s_to_duration(v: i64) -> Duration {\n    Duration::try_seconds(v).expect(\"out-of-range duration\")\n}\n\n/// converts a `i64` representing a `duration(ms)` to [`Duration`]\n#[inline]\npub fn duration_ms_to_duration(v: i64) -> Duration {\n    Duration::try_milliseconds(v).expect(\"out-of-range in duration conversion\")\n}\n\n/// converts a `i64` representing a `duration(us)` to [`Duration`]\n#[inline]\npub fn duration_us_to_duration(v: i64) -> Duration {\n    Duration::microseconds(v)\n}\n\n/// converts a `i64` representing a `duration(ns)` to [`Duration`]\n#[inline]\npub fn duration_ns_to_duration(v: i64) -> Duration {\n    Duration::nanoseconds(v)\n}\n\n/// converts a `i32` representing a `time32(ms)` to [`NaiveTime`]\n#[inline]\npub fn time32ms_to_time(v: i32) -> NaiveTime {\n    let v = v as i64;","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/crates/polars-arrow/src/temporal_conversions.rs#L67-L103","documentation":"Panics inside duration_ms_to_duration: Duration::try_milliseconds returns None when the i64 millisecond count exceeds chrono Duration's hard cap of i64::MAX milliseconds (itself the result of internal seconds-to-ms scaling), and the wrapper .expect panics.","triggerScenarios":"Converting duration(ms) values at extreme magnitude - i64::MIN/MAX sentinels or wrong-unit data (e.g. nanosecond values in a millisecond column near overflow).","commonSituations":"Unit mismatches in arrow duration producers; garbage numeric data; uninitialized i64 memory interpreted as durations.","solutions":["Range-check the value (|v| must fit comfortably in i64 ms, effectively |v| < i64::MAX) and null out extremes","Use Duration::try_milliseconds(v) directly and handle the Option","Fix the upstream unit error","Sanitize sentinel values before conversion"],"exampleFix":"// before\nlet d = duration_ms_to_duration(v); // panics on overflow\n\n// after\nlet d = Duration::try_milliseconds(v)\n    .unwrap_or_default(); // or map to null","handlingStrategy":"validation","validationCode":"fn duration_ms_valid(v: i64) -> bool {\n    Duration::try_milliseconds(v).is_some()\n}","typeGuard":"fn is_valid_duration_ms(v: i64) -> bool {\n    chrono::Duration::try_milliseconds(v).is_some()\n}","tryCatchPattern":null,"preventionTips":["Call Duration::try_milliseconds directly to keep the Option instead of panicking","Guard against wrong-unit ns values overflowing the ms representation","Sanitize extreme sentinels before conversions","Validate arrow duration fields when ingesting foreign data"],"tags":["rust","polars","arrow","temporal","duration","panic"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}