{"record":{"id":"a12b5c38515871b1","repo":"pola-rs/polars","slug":"comparing-durations-with-different-units-is-not-su","errorCode":null,"errorMessage":"comparing durations with different units is not supported","messagePattern":"comparing durations with different units is not supported","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/polars-core/src/datatypes/any_value.rs","lineNumber":1420,"sourceCode":"            (Float64(l), Float64(r)) => Some(l.tot_cmp(r)),\n            (String(l), String(r)) => l.partial_cmp(r),\n            (Binary(l), Binary(r)) => l.partial_cmp(r),\n            #[cfg(feature = \"dtype-date\")]\n            (Date(l), Date(r)) => l.partial_cmp(r),\n            #[cfg(feature = \"dtype-datetime\")]\n            (Datetime(lt, lu, lz), Datetime(rt, ru, rz)) => {\n                if lu != ru || lz != rz {\n                    unimplemented!(\n                        \"comparing datetimes with different units or timezones is not supported\"\n                    );\n                }\n\n                lt.partial_cmp(rt)\n            },\n            #[cfg(feature = \"dtype-duration\")]\n            (Duration(lt, lu), Duration(rt, ru)) => {\n                if lu != ru {\n                    unimplemented!(\"comparing durations with different units is not supported\");\n                }\n\n                lt.partial_cmp(rt)\n            },\n            #[cfg(feature = \"dtype-time\")]\n            (Time(l), Time(r)) => l.partial_cmp(r),\n            #[cfg(feature = \"dtype-categorical\")]\n            (Categorical(l_cat, l_map), Categorical(r_cat, r_map)) => unsafe {\n                let l_str = l_map.cat_to_str_unchecked(*l_cat);\n                let r_str = r_map.cat_to_str_unchecked(*r_cat);\n                l_str.partial_cmp(r_str)\n            },\n            #[cfg(feature = \"dtype-categorical\")]\n            (Enum(l_cat, l_map), Enum(r_cat, r_map)) => {\n                if !Arc::ptr_eq(l_map, r_map) {\n                    unimplemented!(\"can't order enums from different FrozenCategories\")\n                }\n                l_cat.partial_cmp(r_cat)","sourceCodeStart":1402,"sourceCodeEnd":1438,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/crates/polars-core/src/datatypes/any_value.rs#L1402-L1438","documentation":"AnyValue::partial_cmp panics when ordering two Duration scalars with different time units (us/ms/ns). Durations are raw i64 counts in a unit; cross-unit ordering would be wrong without conversion, which this scalar path does not do.","triggerScenarios":"Comparing duration AnyValues from columns of different dtypes: Duration('ms') vs Duration('us'), e.g. df1[\"d\"].get(0) < df2[\"d\"].get(0) after diff/subtract operations that produced different units.","commonSituations":"Durations derived from datetime columns with mismatched units (subtractions of ms vs us timestamps), or comparing parsed durations against literals with a different unit.","solutions":["Cast duration columns to one unit before comparing: col.dt.cast_time_unit('us') works for durations too, or .cast(pl.Duration('us'))","Normalize at the source: keep all upstream datetimes in a single time unit so derived durations share it"],"exampleFix":"# before\ncmp = df1[\"dur\"].get(0) < df2[\"dur\"].get(0)  # ms vs us -> panic\n\n# after\nd1 = df1[\"dur\"].cast(pl.Duration(\"us\")).get(0)\nd2 = df2[\"dur\"].cast(pl.Duration(\"us\")).get(0)\ncmp = d1 < d2","handlingStrategy":"validation","validationCode":"def durations_comparable(a: pl.Series, b: pl.Series) -> bool:\n    return (\n        isinstance(a.dtype, pl.Duration) and isinstance(b.dtype, pl.Duration)\n        and a.dtype.time_unit == b.dtype.time_unit\n    )","typeGuard":"def aligned_duration(s: pl.Series, unit: str = \"us\") -> pl.Series:\n    return s.cast(pl.Duration(unit))","tryCatchPattern":null,"preventionTips":["Derive durations from datetimes kept in a single time unit","Cast duration columns to one unit before extracting scalars"],"tags":["rust","polars","panic","unimplemented","any-value","duration","time-unit","ordering"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}