Path: blob/main/crates/polars-expr/src/dispatch/range/time_range.rs
7884 views
use polars_core::prelude::*;1use polars_time::{ClosedWindow, Duration, time_range_impl};23use super::utils::{4ensure_items_contain_exactly_one_value, temporal_ranges_impl_broadcast,5temporal_series_to_i64_scalar,6};78const CAPACITY_FACTOR: usize = 5;910pub(super) fn time_range(11s: &[Column],12interval: Duration,13closed: ClosedWindow,14) -> PolarsResult<Column> {15let start = &s[0];16let end = &s[1];17let name = start.name();1819ensure_items_contain_exactly_one_value(&[start, end], &["start", "end"])?;2021let dtype = DataType::Time;22let start = temporal_series_to_i64_scalar(&start.cast(&dtype)?)23.ok_or_else(|| polars_err!(ComputeError: "start is an out-of-range time."))?;24let end = temporal_series_to_i64_scalar(&end.cast(&dtype)?)25.ok_or_else(|| polars_err!(ComputeError: "end is an out-of-range time."))?;2627let out = time_range_impl(name.clone(), start, end, interval, closed)?;28Ok(out.cast(&dtype).unwrap().into_column())29}3031pub(super) fn time_ranges(32s: &[Column],33interval: Duration,34closed: ClosedWindow,35) -> PolarsResult<Column> {36let start = &s[0];37let end = &s[1];3839let start = start.cast(&DataType::Time)?;40let end = end.cast(&DataType::Time)?;4142let start_phys = start.to_physical_repr();43let end_phys = end.to_physical_repr();44let start = start_phys.i64().unwrap();45let end = end_phys.i64().unwrap();4647let len = std::cmp::max(start.len(), end.len());48let mut builder = ListPrimitiveChunkedBuilder::<Int64Type>::new(49start.name().clone(),50len,51len * CAPACITY_FACTOR,52DataType::Int64,53);5455let range_impl = |start, end, builder: &mut ListPrimitiveChunkedBuilder<Int64Type>| {56let rng = time_range_impl(PlSmallStr::EMPTY, start, end, interval, closed)?;57builder.append_slice(rng.physical().cont_slice().unwrap());58Ok(())59};6061let out = temporal_ranges_impl_broadcast(start, end, range_impl, &mut builder)?;6263let to_type = DataType::List(Box::new(DataType::Time));64out.cast(&to_type)65}666768