Path: blob/main/crates/polars-plan/src/dsl/functions/range.rs
8430 views
use polars_ops::series::ClosedInterval;1#[cfg(feature = "temporal")]2use polars_time::ClosedWindow;34use super::*;56/// Generate a range of integers.7///8/// Alias for `int_range`.9pub fn arange(start: Expr, end: Expr, step: i64, dtype: DataType) -> Expr {10int_range(start, end, step, dtype)11}1213/// Generate a range of integers.14pub fn int_range(start: Expr, end: Expr, step: i64, dtype: impl Into<DataTypeExpr>) -> Expr {15Expr::n_ary(16RangeFunction::IntRange {17step,18dtype: dtype.into(),19},20vec![start, end],21)22}2324/// Generate a range of integers for each row of the input columns.25pub fn int_ranges(start: Expr, end: Expr, step: Expr, dtype: impl Into<DataTypeExpr>) -> Expr {26Expr::n_ary(27RangeFunction::IntRanges {28dtype: dtype.into(),29},30vec![start, end, step],31)32}3334#[cfg(feature = "dtype-date")]35/// Create a date range column from `start`, `end`, and `interval`, and expressions.36pub fn date_range(37start: Option<Expr>,38end: Option<Expr>,39interval: Option<Duration>,40num_samples: Option<Expr>,41closed: ClosedWindow,42) -> PolarsResult<Expr> {43let (input, arg_type) = DateRangeArgs::parse(start, end, interval, num_samples)?;4445polars_ensure!(46interval.is_none_or(|i| i.is_full_days()),47ComputeError: "`interval` input for `date_range` must consist of full days, got: {:?}", interval.unwrap(),48);4950// Only "both" is supported for date_range(start, end, num_samples).51polars_ensure!(52!(arg_type == DateRangeArgs::StartEndSamples && closed != ClosedWindow::Both),53InvalidOperation: "date_range does not support 'left', 'right', or 'none' for the \54'closed' parameter when 'start', 'end', and 'num_samples' is provided.",55);5657Ok(Expr::n_ary(58RangeFunction::DateRange {59interval,60closed,61arg_type,62},63input,64))65}6667#[cfg(feature = "dtype-date")]68/// Create a column of date ranges from `start`, `end`, `interval`, and `num_samples` expressions.69pub fn date_ranges(70start: Option<Expr>,71end: Option<Expr>,72interval: Option<Duration>,73num_samples: Option<Expr>,74closed: ClosedWindow,75) -> PolarsResult<Expr> {76let (input, arg_type) = DateRangeArgs::parse(start, end, interval, num_samples)?;7778polars_ensure!(79interval.is_none_or(|i| i.is_full_days()),80ComputeError: "`interval` input for `date_range` must consist of full days, got: {:?}", interval.unwrap(),81);8283// Only "both" is supported for date_ranges(start, end, num_samples).84polars_ensure!(85!(arg_type == DateRangeArgs::StartEndSamples && closed != ClosedWindow::Both),86InvalidOperation: "date_range does not support 'left', 'right', or 'none' for the \87'closed' parameter when 'start', 'end', and 'num_samples' is provided.",88);8990Ok(Expr::n_ary(91RangeFunction::DateRanges {92interval,93closed,94arg_type,95},96input,97))98}99100/// Create a datetime range from `start`, `end`, `interval`, and `num_samples` expressions.101#[cfg(feature = "dtype-datetime")]102pub fn datetime_range(103start: Option<Expr>,104end: Option<Expr>,105interval: Option<Duration>,106num_samples: Option<Expr>,107closed: ClosedWindow,108time_unit: Option<TimeUnit>,109time_zone: Option<TimeZone>,110) -> PolarsResult<Expr> {111let (input, arg_type) = DateRangeArgs::parse(start, end, interval, num_samples)?;112Ok(Expr::n_ary(113RangeFunction::DatetimeRange {114interval,115closed,116time_unit,117time_zone,118arg_type,119},120input,121))122}123124/// Create a column of datetime ranges from `start`, `end`, `interval`, and `num_samples` expressions.125#[cfg(feature = "dtype-datetime")]126pub fn datetime_ranges(127start: Option<Expr>,128end: Option<Expr>,129interval: Option<Duration>,130num_samples: Option<Expr>,131closed: ClosedWindow,132time_unit: Option<TimeUnit>,133time_zone: Option<TimeZone>,134) -> PolarsResult<Expr> {135let (input, arg_type) = DateRangeArgs::parse(start, end, interval, num_samples)?;136Ok(Expr::n_ary(137RangeFunction::DatetimeRanges {138interval,139closed,140time_unit,141time_zone,142arg_type,143},144input,145))146}147148/// Generate a time range.149#[cfg(feature = "dtype-time")]150pub fn time_range(start: Expr, end: Expr, interval: Duration, closed: ClosedWindow) -> Expr {151Expr::n_ary(152RangeFunction::TimeRange { interval, closed },153vec![start, end],154)155}156157/// Create a column of time ranges from a `start` and `stop` expression.158#[cfg(feature = "dtype-time")]159pub fn time_ranges(start: Expr, end: Expr, interval: Duration, closed: ClosedWindow) -> Expr {160Expr::n_ary(161RangeFunction::TimeRanges { interval, closed },162vec![start, end],163)164}165166/// Generate a series of equally-spaced points.167pub fn linear_space(start: Expr, end: Expr, num_samples: Expr, closed: ClosedInterval) -> Expr {168Expr::n_ary(169RangeFunction::LinearSpace { closed },170vec![start, end, num_samples],171)172}173174/// Create a column of linearly-spaced sequences from 'start', 'end', and 'num_samples' expressions.175pub fn linear_spaces(176start: Expr,177end: Expr,178num_samples: Expr,179closed: ClosedInterval,180as_array: bool,181) -> PolarsResult<Expr> {182let mut input = Vec::<Expr>::with_capacity(3);183input.push(start);184input.push(end);185let array_width = if as_array {186Some(num_samples.extract_usize().map_err(|_| {187polars_err!(InvalidOperation: "'as_array' is only valid when 'num_samples' is a constant integer")188})?)189} else {190input.push(num_samples);191None192};193194Ok(Expr::n_ary(195RangeFunction::LinearSpaces {196closed,197array_width,198},199input,200))201}202203204