Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-time/src/chunkedarray/kernels.rs
6939 views
1
//! macros that define kernels for extracting
2
//! `week`, `weekday`, `year`, `hour` etc. from primitive arrays.
3
use arrow::array::{BooleanArray, PrimitiveArray};
4
use arrow::compute::arity::unary;
5
#[cfg(feature = "dtype-time")]
6
use arrow::temporal_conversions::time64ns_to_time_opt;
7
use arrow::temporal_conversions::{
8
date32_to_datetime_opt, timestamp_ms_to_datetime_opt, timestamp_ns_to_datetime_opt,
9
timestamp_us_to_datetime_opt,
10
};
11
use chrono::{Datelike, Timelike};
12
13
use super::super::windows::calendar::*;
14
use super::*;
15
16
trait PolarsIso {
17
fn week(&self) -> i8;
18
fn iso_year(&self) -> i32;
19
}
20
21
impl PolarsIso for NaiveDateTime {
22
fn week(&self) -> i8 {
23
self.iso_week().week().try_into().unwrap()
24
}
25
fn iso_year(&self) -> i32 {
26
self.iso_week().year()
27
}
28
}
29
30
impl PolarsIso for NaiveDate {
31
fn week(&self) -> i8 {
32
self.iso_week().week().try_into().unwrap()
33
}
34
fn iso_year(&self) -> i32 {
35
self.iso_week().year()
36
}
37
}
38
39
macro_rules! to_temporal_unit {
40
($name: ident, $chrono_method: ident, $to_datetime_fn: expr,
41
$primitive_in: ty,
42
$primitive_out: ty,
43
$dtype_out:expr) => {
44
pub(crate) fn $name(arr: &PrimitiveArray<$primitive_in>) -> ArrayRef {
45
Box::new(unary(
46
arr,
47
|value| {
48
$to_datetime_fn(value)
49
.map(|dt| dt.$chrono_method() as $primitive_out)
50
.unwrap_or(value as $primitive_out)
51
},
52
$dtype_out,
53
)) as ArrayRef
54
}
55
};
56
}
57
58
macro_rules! to_boolean_temporal_unit {
59
($name: ident, $chrono_method: ident, $boolean_method: ident, $to_datetime_fn: expr, $dtype_in: ty) => {
60
pub(crate) fn $name(arr: &PrimitiveArray<$dtype_in>) -> ArrayRef {
61
let values = arr
62
.values()
63
.iter()
64
.map(|value| {
65
$to_datetime_fn(*value)
66
.map(|dt| $boolean_method(dt.$chrono_method()))
67
.unwrap_or(false)
68
})
69
.collect::<Vec<_>>();
70
Box::new(BooleanArray::new(
71
ArrowDataType::Boolean,
72
values.into(),
73
arr.validity().cloned(),
74
))
75
}
76
};
77
}
78
79
macro_rules! to_calendar_value {
80
($name: ident, $dt: ident, $expr: expr, $to_datetime_fn: expr,
81
$primitive_in: ty,
82
$primitive_out: ty,
83
$dtype_out:expr) => {
84
pub(crate) fn $name(arr: &PrimitiveArray<$primitive_in>) -> ArrayRef {
85
Box::new(unary(
86
arr,
87
|value| {
88
$to_datetime_fn(value)
89
.map(|$dt| $expr as $primitive_out)
90
.unwrap_or(value as $primitive_out)
91
},
92
$dtype_out,
93
)) as ArrayRef
94
}
95
};
96
}
97
98
// Dates
99
#[cfg(feature = "dtype-date")]
100
to_temporal_unit!(
101
date_to_iso_week,
102
week,
103
date32_to_datetime_opt,
104
i32,
105
i8,
106
ArrowDataType::Int8
107
);
108
#[cfg(feature = "dtype-date")]
109
to_temporal_unit!(
110
date_to_iso_year,
111
iso_year,
112
date32_to_datetime_opt,
113
i32,
114
i32,
115
ArrowDataType::Int32
116
);
117
#[cfg(feature = "dtype-date")]
118
to_temporal_unit!(
119
date_to_year,
120
year,
121
date32_to_datetime_opt,
122
i32,
123
i32,
124
ArrowDataType::Int32
125
);
126
#[cfg(feature = "dtype-date")]
127
to_boolean_temporal_unit!(
128
date_to_is_leap_year,
129
year,
130
is_leap_year,
131
date32_to_datetime_opt,
132
i32
133
);
134
#[cfg(feature = "dtype-date")]
135
to_temporal_unit!(
136
date_to_month,
137
month,
138
date32_to_datetime_opt,
139
i32,
140
i8,
141
ArrowDataType::Int8
142
);
143
#[cfg(feature = "dtype-date")]
144
to_temporal_unit!(
145
date_to_day,
146
day,
147
date32_to_datetime_opt,
148
i32,
149
i8,
150
ArrowDataType::Int8
151
);
152
#[cfg(feature = "dtype-date")]
153
to_temporal_unit!(
154
date_to_ordinal,
155
ordinal,
156
date32_to_datetime_opt,
157
i32,
158
i16,
159
ArrowDataType::Int16
160
);
161
#[cfg(feature = "dtype-date")]
162
to_calendar_value!(
163
date_to_days_in_month,
164
dt,
165
days_in_month(dt.year(), dt.month() as u8),
166
date32_to_datetime_opt,
167
i32,
168
i8,
169
ArrowDataType::Int8
170
);
171
172
// Times
173
#[cfg(feature = "dtype-time")]
174
to_temporal_unit!(
175
time_to_hour,
176
hour,
177
time64ns_to_time_opt,
178
i64,
179
i8,
180
ArrowDataType::Int8
181
);
182
#[cfg(feature = "dtype-time")]
183
to_temporal_unit!(
184
time_to_minute,
185
minute,
186
time64ns_to_time_opt,
187
i64,
188
i8,
189
ArrowDataType::Int8
190
);
191
#[cfg(feature = "dtype-time")]
192
to_temporal_unit!(
193
time_to_second,
194
second,
195
time64ns_to_time_opt,
196
i64,
197
i8,
198
ArrowDataType::Int8
199
);
200
#[cfg(feature = "dtype-time")]
201
to_temporal_unit!(
202
time_to_nanosecond,
203
nanosecond,
204
time64ns_to_time_opt,
205
i64,
206
i32,
207
ArrowDataType::Int32
208
);
209
210
#[cfg(feature = "dtype-datetime")]
211
to_temporal_unit!(
212
datetime_to_ordinal_ns,
213
ordinal,
214
timestamp_ns_to_datetime_opt,
215
i64,
216
i16,
217
ArrowDataType::Int16
218
);
219
220
#[cfg(feature = "dtype-datetime")]
221
to_temporal_unit!(
222
datetime_to_ordinal_ms,
223
ordinal,
224
timestamp_ms_to_datetime_opt,
225
i64,
226
i16,
227
ArrowDataType::Int16
228
);
229
#[cfg(feature = "dtype-datetime")]
230
to_temporal_unit!(
231
datetime_to_ordinal_us,
232
ordinal,
233
timestamp_us_to_datetime_opt,
234
i64,
235
i16,
236
ArrowDataType::Int16
237
);
238
239
#[cfg(feature = "dtype-datetime")]
240
to_temporal_unit!(
241
datetime_to_iso_year_ns,
242
iso_year,
243
timestamp_ns_to_datetime_opt,
244
i64,
245
i32,
246
ArrowDataType::Int32
247
);
248
249
#[cfg(feature = "dtype-datetime")]
250
to_temporal_unit!(
251
datetime_to_iso_year_us,
252
iso_year,
253
timestamp_us_to_datetime_opt,
254
i64,
255
i32,
256
ArrowDataType::Int32
257
);
258
259
#[cfg(feature = "dtype-datetime")]
260
to_temporal_unit!(
261
datetime_to_iso_year_ms,
262
iso_year,
263
timestamp_ms_to_datetime_opt,
264
i64,
265
i32,
266
ArrowDataType::Int32
267
);
268
#[cfg(feature = "dtype-datetime")]
269
to_boolean_temporal_unit!(
270
datetime_to_is_leap_year_ns,
271
year,
272
is_leap_year,
273
timestamp_ns_to_datetime_opt,
274
i64
275
);
276
#[cfg(feature = "dtype-datetime")]
277
to_boolean_temporal_unit!(
278
datetime_to_is_leap_year_us,
279
year,
280
is_leap_year,
281
timestamp_us_to_datetime_opt,
282
i64
283
);
284
#[cfg(feature = "dtype-datetime")]
285
to_boolean_temporal_unit!(
286
datetime_to_is_leap_year_ms,
287
year,
288
is_leap_year,
289
timestamp_ms_to_datetime_opt,
290
i64
291
);
292
293
#[cfg(feature = "dtype-datetime")]
294
to_calendar_value!(
295
datetime_to_days_in_month_ns,
296
dt,
297
days_in_month(dt.year(), dt.month() as u8),
298
timestamp_ns_to_datetime_opt,
299
i64,
300
i8,
301
ArrowDataType::Int8
302
);
303
#[cfg(feature = "dtype-datetime")]
304
to_calendar_value!(
305
datetime_to_days_in_month_us,
306
dt,
307
days_in_month(dt.year(), dt.month() as u8),
308
timestamp_us_to_datetime_opt,
309
i64,
310
i8,
311
ArrowDataType::Int8
312
);
313
#[cfg(feature = "dtype-datetime")]
314
to_calendar_value!(
315
datetime_to_days_in_month_ms,
316
dt,
317
days_in_month(dt.year(), dt.month() as u8),
318
timestamp_ms_to_datetime_opt,
319
i64,
320
i8,
321
ArrowDataType::Int8
322
);
323
324