在Rust中使用Polars重采样5分钟至15分钟时间序列遇阻求助
Rust Polars 5分钟转15分钟时间序列重采样生成OHLC解决方案
依赖配置
确保Cargo.toml中包含Polars的必要特性:
[dependencies] polars = { version = "0.35.4", features = ["lazy", "csv", "dynamic_groupby"] } chrono = "0.4.31"
完整实现代码
use polars::prelude::*; use chrono::NaiveDateTime; fn main() -> Result<(), Box<dyn std::error::Error>> { // 读取CSV数据(适配你的数据格式,确保包含datetime、open、high、low、close列) let raw_df = CsvReader::from_path("your_data.csv")? .infer_schema(Some(100)) .has_header(true) .finish()?; // 将字符串格式的datetime转换为Polars可识别的时间类型 let parsed_df = raw_df.with_column( col("datetime") .str() .strptime(StrpTimeOptions::new("%Y-%m-%d %H:%M:%S"), false) .alias("datetime") )?; // 15分钟窗口重采样并生成OHLC let ohlc_df = parsed_df .lazy() // 基于datetime列做15分钟动态分组 .groupby_dynamic([col("datetime")], [Duration::parse("15m")]) // 定义OHLC各列的聚合规则 .agg([ col("open").first().alias("open"), col("high").max().alias("high"), col("low").min().alias("low"), col("close").last().alias("close"), // 若有其他列(如volume),可追加聚合规则,例如col("volume").sum().alias("volume") ]) // 按时间排序保证序列正确 .sort("datetime", Default::default()) .collect()?; // 打印结果或保存到文件 println!("{}", ohlc_df); ohlc_df.write_csv("resampled_ohlc.csv")?; Ok(()) }
问题原因与修正说明
仅时间分组无列聚合:
你之前的代码缺少agg步骤,groupby_dynamic仅完成分组逻辑,必须通过agg明确指定每列的聚合规则(如首值、最大值等),才能生成目标OHLC数据。添加by参数后重采样失效:
groupby_dynamic的by参数用于指定额外的分组维度(比如多交易标的场景下的symbol列),如果错误将非分组维度的列加入by,会导致每个分组仅包含单条原始数据,重采样逻辑直接失效。
若你的数据包含多维度(如不同交易对),正确写法如下:.groupby_dynamic([col("datetime")], [Duration::parse("15m")]) .by([col("symbol")]) .agg([...])
数据格式注意事项
- 确保CSV中的
datetime列格式与代码中的解析规则(%Y-%m-%d %H:%M:%S)匹配,若为带时区的时间,需调整为chrono::DateTime<Utc>并修改解析逻辑。 - 确认
open/high/low/close列是数值类型(Polars会自动推断,若异常可手动指定schema)。
内容的提问来源于stack exchange,提问作者nklsla
相关产品推荐
相关产品推荐

