1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use std::fmt::Write;
use arrow::temporal_conversions::date32_to_date;
use super::*;
use crate::prelude::*;
pub(crate) fn naive_date_to_date(nd: NaiveDate) -> i32 {
let nt = NaiveTime::from_hms_opt(0, 0, 0).unwrap();
let ndt = NaiveDateTime::new(nd, nt);
naive_datetime_to_date(ndt)
}
impl DateChunked {
pub fn as_date_iter(&self) -> impl Iterator<Item = Option<NaiveDate>> + TrustedLen + '_ {
unsafe {
self.downcast_iter()
.flat_map(|iter| {
iter.into_iter()
.map(|opt_v| opt_v.copied().map(date32_to_date))
})
.trust_my_length(self.len())
}
}
pub fn from_naive_date<I: IntoIterator<Item = NaiveDate>>(name: &str, v: I) -> Self {
let unit = v.into_iter().map(naive_date_to_date).collect::<Vec<_>>();
Int32Chunked::from_vec(name, unit).into()
}
pub fn strftime(&self, fmt: &str) -> Utf8Chunked {
let date = NaiveDate::from_ymd_opt(2001, 1, 1).unwrap();
let fmted = format!("{}", date.format(fmt));
let mut ca: Utf8Chunked = self.apply_kernel_cast(&|arr| {
let mut buf = String::new();
let mut mutarr =
MutableUtf8Array::with_capacities(arr.len(), arr.len() * fmted.len() + 1);
for opt in arr.into_iter() {
match opt {
None => mutarr.push_null(),
Some(v) => {
buf.clear();
let datefmt = date32_to_date(*v).format(fmt);
write!(buf, "{datefmt}").unwrap();
mutarr.push(Some(&buf))
}
}
}
let arr: Utf8Array<i64> = mutarr.into();
Box::new(arr)
});
ca.rename(self.name());
ca
}
pub fn from_naive_date_options<I: IntoIterator<Item = Option<NaiveDate>>>(
name: &str,
v: I,
) -> Self {
let unit = v.into_iter().map(|opt| opt.map(naive_date_to_date));
Int32Chunked::from_iter_options(name, unit).into()
}
}