quant1x/pandas/
mod.rs

1use std::time::Duration;
2
3/// Parse frequency string similar to C++ pandas::ParseTimeRule + parse_frequency
4/// Returns (minutes, normalized_freq_string) or Err(message)
5pub fn parse_frequency(freq: &str) -> Result<(i64, String), String> {
6    let frequency = freq.trim();
7    if frequency.is_empty() {
8        return Err("empty freq string".to_string());
9    }
10    // find numeric prefix
11    let mut i = 0usize;
12    for c in frequency.chars() {
13        if c.is_ascii_digit() {
14            i += 1;
15        } else {
16            break;
17        }
18    }
19    let n: i64 = if i == 0 {
20        1
21    } else {
22        frequency[..i]
23            .parse::<i64>()
24            .map_err(|e| format!("invalid number in freq: {}", e))?
25    };
26    let unit = frequency[i..].to_string();
27    if unit.is_empty() {
28        return Err("missing unit in freq".to_string());
29    }
30    // map unit to minutes or hours
31    // Accept common variations: N, ns, U, us, L, ms, S/s, T/min, H/h, D/d
32    let minutes: i64 = match unit.as_str() {
33        "N" | "ns" => return Err("nanoseconds not supported for minute kline".to_string()),
34        "U" | "us" | "μs" => return Err("microseconds not supported for minute kline".to_string()),
35        "L" | "ms" => return Err("milliseconds not supported for minute kline".to_string()),
36        "S" | "s" => return Err("seconds not supported for minute kline".to_string()),
37        "T" | "min" => n,
38        "H" | "h" => n * 60,
39        "D" | "d" => n * 60 * 24,
40        _ => return Err(format!("unsupported freq unit: {}", unit)),
41    };
42    Ok((minutes, frequency.to_string()))
43}