Path: blob/main/docs/source/src/rust/user-guide/expressions/casting.rs
7889 views
fn main() -> Result<(), Box<dyn std::error::Error>> {1// --8<-- [start:dfnum]2use polars::prelude::*;34let df = df! (5"integers"=> [1, 2, 3],6"big_integers"=> [10000002, 2, 30000003],7"floats"=> [4.0, 5.8, -6.3],8)?;910println!("{df}");11// --8<-- [end:dfnum]1213// --8<-- [start:castnum]14let result = df15.clone()16.lazy()17.select([18col("integers")19.cast(DataType::Float32)20.alias("integers_as_floats"),21col("floats")22.cast(DataType::Int32)23.alias("floats_as_integers"),24])25.collect()?;26println!("{result}");27// --8<-- [end:castnum]2829// --8<-- [start:downcast]30println!("Before downcasting: {} bytes", df.estimated_size());31let result = df32.clone()33.lazy()34.with_columns([35col("integers").cast(DataType::Int16),36col("floats").cast(DataType::Float32),37])38.collect()?;39println!("After downcasting: {} bytes", result.estimated_size());40// --8<-- [end:downcast]4142// --8<-- [start:overflow]43let result = df44.clone()45.lazy()46.select([col("big_integers").strict_cast(DataType::Int8)])47.collect();48if let Err(e) = result {49println!("{e}")50};51// --8<-- [end:overflow]5253// --8<-- [start:overflow2]54let result = df55.lazy()56.select([col("big_integers").cast(DataType::Int8)])57.collect()?;58println!("{result}");59// --8<-- [end:overflow2]6061// --8<-- [start:strings]62let df = df! (63"integers_as_strings" => ["1", "2", "3"],64"floats_as_strings" => ["4.0", "5.8", "-6.3"],65"floats" => [4.0, 5.8, -6.3],66)?;6768let result = df69.lazy()70.select([71col("integers_as_strings").cast(DataType::Int32),72col("floats_as_strings").cast(DataType::Float64),73col("floats").cast(DataType::String),74])75.collect()?;76println!("{result}");77// --8<-- [end:strings]7879// --8<-- [start:strings2]80let df = df! ("floats" => ["4.0", "5.8", "- 6 . 3"])?;8182let result = df83.lazy()84.select([col("floats").strict_cast(DataType::Float64)])85.collect();86if let Err(e) = result {87println!("{e}")88};89// --8<-- [end:strings2]9091// --8<-- [start:bool]92let df = df! (93"integers"=> [-1, 0, 2, 3, 4],94"floats"=> [0.0, 1.0, 2.0, 3.0, 4.0],95"bools"=> [true, false, true, false, true],96)?;9798let result = df99.lazy()100.select([101col("integers").cast(DataType::Boolean),102col("floats").cast(DataType::Boolean),103col("bools").cast(DataType::UInt8),104])105.collect()?;106println!("{result}");107// --8<-- [end:bool]108109// --8<-- [start:dates]110use chrono::prelude::*;111112let df = df!(113"date" => [114NaiveDate::from_ymd_opt(1970, 1, 1).unwrap(), // epoch115NaiveDate::from_ymd_opt(1970, 1, 10).unwrap(), // 9 days later116],117"datetime" => [118NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_opt(0, 0, 0).unwrap(), // epoch119NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_opt(0, 1, 0).unwrap(), // 1 minute later120],121"time" => [122NaiveTime::from_hms_opt(0, 0, 0).unwrap(), // reference time123NaiveTime::from_hms_opt(0, 0, 1).unwrap(), // 1 second later124]125)126.unwrap()127.lazy()128// Make the time unit match that of Python's for the same results.129.with_column(col("datetime").cast(DataType::Datetime(TimeUnit::Microseconds, None)))130.collect()?;131132let result = df133.lazy()134.select([135col("date").cast(DataType::Int64).alias("days_since_epoch"),136col("datetime")137.cast(DataType::Int64)138.alias("us_since_epoch"),139col("time").cast(DataType::Int64).alias("ns_since_midnight"),140])141.collect()?;142println!("{result}");143// --8<-- [end:dates]144145// --8<-- [start:dates2]146let df = df! (147"date" => [148NaiveDate::from_ymd_opt(2022, 1, 1).unwrap(),149NaiveDate::from_ymd_opt(2022, 1, 2).unwrap(),150],151"string" => [152"2022-01-01",153"2022-01-02",154],155)?;156157let result = df158.lazy()159.select([160col("date").dt().to_string("%Y-%m-%d"),161col("string").str().to_datetime(162Some(TimeUnit::Microseconds),163None,164StrptimeOptions::default(),165lit("raise"),166),167])168.collect()?;169println!("{result}");170// --8<-- [end:dates2]171172Ok(())173}174175176