3 个版本
0.2.2 | 2023年2月14日 |
---|---|
0.2.1 | 2023年2月14日 |
0.1.2 |
|
#313 in 日期和时间
每月 27 次下载
10KB
120 行
昼夜工具
昼夜数据是循环数据,如一天中的时间、一周中的某一天等。也可以想象其他方式循环的数据,如月亮的相位、季节或销售周期等。
平均值
可能出现的一个问题是平均值。想象一下每晚的数据交付。你想要知道交付通常发生在什么时候,你的时间看起来像 [23:00, 01:00, 23:30, 00:30]
。如果你简单地将交付时间相加,你会得到中午,这显然是错误的。相反,我们首先将时间投影到单位圆上,得到笛卡尔 X/Y 坐标。然后我们平均这些点,生成圆内的一个新点。然后,如果我们从原点画一条直线通过这个点到圆的边缘,我们得到一个新的时间,即交付的平均时间。
此外,我们得到一个置信度测量值,即平均点与原点的距离。距离为 1 表示所有点都相同。距离为 0 表示点均匀分布,因此实际上没有有意义的平均值。这可以用来了解你的平均在未来的预测能力。一个用例是动态调整警报阈值。它使用 f64
,因此有一些精度问题,但经过一些输出清理后足够用于大多数目的。
use circadian_tools;
fn main() {
let data = vec![23.0, 1.0];
let (avg, conf) = circadian_tools::circadian_average(24.0, data.into_iter());
println!("Average of 23 and 1 on a 24 hour cycle is {}, with {} confidence", avg, conf);
// prints "Average of 23 and 1 on a 24 hour cycle is 0.0000..., with 0.9659... confidence"
}
还有一个用于平均 Timelike
对象向量的函数。如果你有一组时间并且想要知道一天中的平均时间,这将很有用。
use chrono::NaiveTime;
use circadian_tools;
fn main() {
let data = vec![
NaiveTime::from_hms_opt(1, 0, 0).unwrap(),
NaiveTime::from_hms_opt(23, 0, 0).unwrap(),
];
let avg_time = circadian_tools::avg_time_of_day(data.into_iter());
println!("Average of 1100 and 0100 is {}", avg_time);
// prints "Average of 1100 and 0100 is 0000"
}
如果你有任何建议,请告诉我!
这是一个小型库,从平均值计算开始,仍在开发中。我会继续添加更多工具。如果您有任何建议,请告诉我。
依赖项
~1MB
~18K SLoC