polars-df 0.2.0-x86_64-darwin

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -0
  3. data/CHANGELOG.md +33 -0
  4. data/Cargo.lock +2230 -0
  5. data/Cargo.toml +10 -0
  6. data/LICENSE-THIRD-PARTY.txt +38856 -0
  7. data/LICENSE.txt +20 -0
  8. data/README.md +91 -0
  9. data/lib/polars/3.0/polars.bundle +0 -0
  10. data/lib/polars/3.1/polars.bundle +0 -0
  11. data/lib/polars/3.2/polars.bundle +0 -0
  12. data/lib/polars/batched_csv_reader.rb +96 -0
  13. data/lib/polars/cat_expr.rb +52 -0
  14. data/lib/polars/cat_name_space.rb +54 -0
  15. data/lib/polars/convert.rb +100 -0
  16. data/lib/polars/data_frame.rb +4833 -0
  17. data/lib/polars/data_types.rb +122 -0
  18. data/lib/polars/date_time_expr.rb +1418 -0
  19. data/lib/polars/date_time_name_space.rb +1484 -0
  20. data/lib/polars/dynamic_group_by.rb +52 -0
  21. data/lib/polars/exceptions.rb +20 -0
  22. data/lib/polars/expr.rb +5307 -0
  23. data/lib/polars/expr_dispatch.rb +22 -0
  24. data/lib/polars/functions.rb +453 -0
  25. data/lib/polars/group_by.rb +558 -0
  26. data/lib/polars/io.rb +814 -0
  27. data/lib/polars/lazy_frame.rb +2442 -0
  28. data/lib/polars/lazy_functions.rb +1195 -0
  29. data/lib/polars/lazy_group_by.rb +93 -0
  30. data/lib/polars/list_expr.rb +610 -0
  31. data/lib/polars/list_name_space.rb +346 -0
  32. data/lib/polars/meta_expr.rb +54 -0
  33. data/lib/polars/rolling_group_by.rb +35 -0
  34. data/lib/polars/series.rb +3730 -0
  35. data/lib/polars/slice.rb +104 -0
  36. data/lib/polars/string_expr.rb +972 -0
  37. data/lib/polars/string_name_space.rb +690 -0
  38. data/lib/polars/struct_expr.rb +100 -0
  39. data/lib/polars/struct_name_space.rb +64 -0
  40. data/lib/polars/utils.rb +192 -0
  41. data/lib/polars/version.rb +4 -0
  42. data/lib/polars/when.rb +16 -0
  43. data/lib/polars/when_then.rb +19 -0
  44. data/lib/polars-df.rb +1 -0
  45. data/lib/polars.rb +50 -0
  46. metadata +89 -0
@@ -0,0 +1,1418 @@
1
+ module Polars
2
+ # Namespace for datetime related expressions.
3
+ class DateTimeExpr
4
+ # @private
5
+ attr_accessor :_rbexpr
6
+
7
+ # @private
8
+ def initialize(expr)
9
+ self._rbexpr = expr._rbexpr
10
+ end
11
+
12
+ # Divide the date/datetime range into buckets.
13
+ #
14
+ # Each date/datetime is mapped to the start of its bucket.
15
+ #
16
+ # @param every [String]
17
+ # Every interval start and period length
18
+ # @param offset [String]
19
+ # Offset the window
20
+ #
21
+ # @return [Expr]
22
+ #
23
+ # @note
24
+ # The `every` and `offset` argument are created with the
25
+ # the following small string formatting language:
26
+ #
27
+ # 1ns # 1 nanosecond
28
+ # 1us # 1 microsecond
29
+ # 1ms # 1 millisecond
30
+ # 1s # 1 second
31
+ # 1m # 1 minute
32
+ # 1h # 1 hour
33
+ # 1d # 1 day
34
+ # 1w # 1 week
35
+ # 1mo # 1 calendar month
36
+ # 1y # 1 calendar year
37
+ #
38
+ # eg: 3d12h4m25s # 3 days, 12 hours, 4 minutes, and 25 seconds
39
+ #
40
+ # @example
41
+ # start = DateTime.new(2001, 1, 1)
42
+ # stop = DateTime.new(2001, 1, 2)
43
+ # df = Polars.date_range(
44
+ # start, stop, "225m", name: "dates"
45
+ # ).to_frame
46
+ # # =>
47
+ # # shape: (7, 1)
48
+ # # ┌─────────────────────┐
49
+ # # │ dates │
50
+ # # │ --- │
51
+ # # │ datetime[μs] │
52
+ # # ╞═════════════════════╡
53
+ # # │ 2001-01-01 00:00:00 │
54
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
55
+ # # │ 2001-01-01 03:45:00 │
56
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
57
+ # # │ 2001-01-01 07:30:00 │
58
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
59
+ # # │ 2001-01-01 11:15:00 │
60
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
61
+ # # │ 2001-01-01 15:00:00 │
62
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
63
+ # # │ 2001-01-01 18:45:00 │
64
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
65
+ # # │ 2001-01-01 22:30:00 │
66
+ # # └─────────────────────┘
67
+ #
68
+ # @example
69
+ # df.select(Polars.col("dates").dt.truncate("1h"))
70
+ # # =>
71
+ # # shape: (7, 1)
72
+ # # ┌─────────────────────┐
73
+ # # │ dates │
74
+ # # │ --- │
75
+ # # │ datetime[μs] │
76
+ # # ╞═════════════════════╡
77
+ # # │ 2001-01-01 00:00:00 │
78
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
79
+ # # │ 2001-01-01 03:00:00 │
80
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
81
+ # # │ 2001-01-01 07:00:00 │
82
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
83
+ # # │ 2001-01-01 11:00:00 │
84
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
85
+ # # │ 2001-01-01 15:00:00 │
86
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
87
+ # # │ 2001-01-01 18:00:00 │
88
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
89
+ # # │ 2001-01-01 22:00:00 │
90
+ # # └─────────────────────┘
91
+ #
92
+ # @example
93
+ # start = DateTime.new(2001, 1, 1)
94
+ # stop = DateTime.new(2001, 1, 1, 1)
95
+ # df = Polars.date_range(start, stop, "10m", name: "dates").to_frame
96
+ # df.select(["dates", Polars.col("dates").dt.truncate("30m").alias("truncate")])
97
+ # # =>
98
+ # # shape: (7, 2)
99
+ # # ┌─────────────────────┬─────────────────────┐
100
+ # # │ dates ┆ truncate │
101
+ # # │ --- ┆ --- │
102
+ # # │ datetime[μs] ┆ datetime[μs] │
103
+ # # ╞═════════════════════╪═════════════════════╡
104
+ # # │ 2001-01-01 00:00:00 ┆ 2001-01-01 00:00:00 │
105
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
106
+ # # │ 2001-01-01 00:10:00 ┆ 2001-01-01 00:00:00 │
107
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
108
+ # # │ 2001-01-01 00:20:00 ┆ 2001-01-01 00:00:00 │
109
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
110
+ # # │ 2001-01-01 00:30:00 ┆ 2001-01-01 00:30:00 │
111
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
112
+ # # │ 2001-01-01 00:40:00 ┆ 2001-01-01 00:30:00 │
113
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
114
+ # # │ 2001-01-01 00:50:00 ┆ 2001-01-01 00:30:00 │
115
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
116
+ # # │ 2001-01-01 01:00:00 ┆ 2001-01-01 01:00:00 │
117
+ # # └─────────────────────┴─────────────────────┘
118
+ def truncate(every, offset: nil)
119
+ if offset.nil?
120
+ offset = "0ns"
121
+ end
122
+
123
+ Utils.wrap_expr(
124
+ _rbexpr.dt_truncate(
125
+ Utils._timedelta_to_pl_duration(every),
126
+ Utils._timedelta_to_pl_duration(offset)
127
+ )
128
+ )
129
+ end
130
+
131
+ # Divide the date/datetime range into buckets.
132
+ #
133
+ # Each date/datetime in the first half of the interval
134
+ # is mapped to the start of its bucket.
135
+ # Each date/datetime in the seconod half of the interval
136
+ # is mapped to the end of its bucket.
137
+ #
138
+ # @param every [String]
139
+ # Every interval start and period length
140
+ # @param offset [String]
141
+ # Offset the window
142
+ #
143
+ # @return [Expr]
144
+ #
145
+ # @note
146
+ # The `every` and `offset` argument are created with the
147
+ # the following small string formatting language:
148
+ #
149
+ # 1ns # 1 nanosecond
150
+ # 1us # 1 microsecond
151
+ # 1ms # 1 millisecond
152
+ # 1s # 1 second
153
+ # 1m # 1 minute
154
+ # 1h # 1 hour
155
+ # 1d # 1 day
156
+ # 1w # 1 week
157
+ # 1mo # 1 calendar month
158
+ # 1y # 1 calendar year
159
+ #
160
+ # eg: 3d12h4m25s # 3 days, 12 hours, 4 minutes, and 25 seconds
161
+ #
162
+ # @note
163
+ # This functionality is currently experimental and may
164
+ # change without it being considered a breaking change.
165
+ #
166
+ # @example
167
+ # start = DateTime.new(2001, 1, 1)
168
+ # stop = DateTime.new(2001, 1, 2)
169
+ # df = Polars.date_range(
170
+ # start, stop, "225m", name: "dates"
171
+ # ).to_frame
172
+ # # =>
173
+ # # shape: (7, 1)
174
+ # # ┌─────────────────────┐
175
+ # # │ dates │
176
+ # # │ --- │
177
+ # # │ datetime[μs] │
178
+ # # ╞═════════════════════╡
179
+ # # │ 2001-01-01 00:00:00 │
180
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
181
+ # # │ 2001-01-01 03:45:00 │
182
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
183
+ # # │ 2001-01-01 07:30:00 │
184
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
185
+ # # │ 2001-01-01 11:15:00 │
186
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
187
+ # # │ 2001-01-01 15:00:00 │
188
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
189
+ # # │ 2001-01-01 18:45:00 │
190
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
191
+ # # │ 2001-01-01 22:30:00 │
192
+ # # └─────────────────────┘
193
+ #
194
+ # @example
195
+ # df.select(Polars.col("dates").dt.round("1h"))
196
+ # # =>
197
+ # # shape: (7, 1)
198
+ # # ┌─────────────────────┐
199
+ # # │ dates │
200
+ # # │ --- │
201
+ # # │ datetime[μs] │
202
+ # # ╞═════════════════════╡
203
+ # # │ 2001-01-01 00:00:00 │
204
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
205
+ # # │ 2001-01-01 04:00:00 │
206
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
207
+ # # │ 2001-01-01 08:00:00 │
208
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
209
+ # # │ 2001-01-01 11:00:00 │
210
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
211
+ # # │ 2001-01-01 15:00:00 │
212
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
213
+ # # │ 2001-01-01 19:00:00 │
214
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
215
+ # # │ 2001-01-01 23:00:00 │
216
+ # # └─────────────────────┘
217
+ #
218
+ # @example
219
+ # start = DateTime.new(2001, 1, 1)
220
+ # stop = DateTime.new(2001, 1, 1, 1)
221
+ # df = Polars.date_range(start, stop, "10m", name: "dates").to_frame
222
+ # df.select(["dates", Polars.col("dates").dt.round("30m").alias("round")])
223
+ # # =>
224
+ # # shape: (7, 2)
225
+ # # ┌─────────────────────┬─────────────────────┐
226
+ # # │ dates ┆ round │
227
+ # # │ --- ┆ --- │
228
+ # # │ datetime[μs] ┆ datetime[μs] │
229
+ # # ╞═════════════════════╪═════════════════════╡
230
+ # # │ 2001-01-01 00:00:00 ┆ 2001-01-01 00:00:00 │
231
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
232
+ # # │ 2001-01-01 00:10:00 ┆ 2001-01-01 00:00:00 │
233
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
234
+ # # │ 2001-01-01 00:20:00 ┆ 2001-01-01 00:30:00 │
235
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
236
+ # # │ 2001-01-01 00:30:00 ┆ 2001-01-01 00:30:00 │
237
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
238
+ # # │ 2001-01-01 00:40:00 ┆ 2001-01-01 00:30:00 │
239
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
240
+ # # │ 2001-01-01 00:50:00 ┆ 2001-01-01 01:00:00 │
241
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
242
+ # # │ 2001-01-01 01:00:00 ┆ 2001-01-01 01:00:00 │
243
+ # # └─────────────────────┴─────────────────────┘
244
+ def round(every, offset: nil)
245
+ if offset.nil?
246
+ offset = "0ns"
247
+ end
248
+
249
+ Utils.wrap_expr(
250
+ _rbexpr.dt_round(
251
+ Utils._timedelta_to_pl_duration(every),
252
+ Utils._timedelta_to_pl_duration(offset)
253
+ )
254
+ )
255
+ end
256
+
257
+ # Format Date/datetime with a formatting rule.
258
+ #
259
+ # See [chrono strftime/strptime](https://docs.rs/chrono/latest/chrono/format/strftime/index.html).
260
+ #
261
+ # @return [Expr]
262
+ def strftime(fmt)
263
+ Utils.wrap_expr(_rbexpr.strftime(fmt))
264
+ end
265
+
266
+ # Extract year from underlying Date representation.
267
+ #
268
+ # Applies to Date and Datetime columns.
269
+ #
270
+ # Returns the year number in the calendar date.
271
+ #
272
+ # @return [Expr]
273
+ #
274
+ # @example
275
+ # start = DateTime.new(2001, 1, 1)
276
+ # stop = DateTime.new(2002, 7, 1)
277
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "180d")})
278
+ # # =>
279
+ # # shape: (4, 1)
280
+ # # ┌─────────────────────┐
281
+ # # │ date │
282
+ # # │ --- │
283
+ # # │ datetime[μs] │
284
+ # # ╞═════════════════════╡
285
+ # # │ 2001-01-01 00:00:00 │
286
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
287
+ # # │ 2001-06-30 00:00:00 │
288
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
289
+ # # │ 2001-12-27 00:00:00 │
290
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
291
+ # # │ 2002-06-25 00:00:00 │
292
+ # # └─────────────────────┘
293
+ #
294
+ # @example
295
+ # df.select(Polars.col("date").dt.year)
296
+ # # =>
297
+ # # shape: (4, 1)
298
+ # # ┌──────┐
299
+ # # │ date │
300
+ # # │ --- │
301
+ # # │ i32 │
302
+ # # ╞══════╡
303
+ # # │ 2001 │
304
+ # # ├╌╌╌╌╌╌┤
305
+ # # │ 2001 │
306
+ # # ├╌╌╌╌╌╌┤
307
+ # # │ 2001 │
308
+ # # ├╌╌╌╌╌╌┤
309
+ # # │ 2002 │
310
+ # # └──────┘
311
+ def year
312
+ Utils.wrap_expr(_rbexpr.year)
313
+ end
314
+
315
+ # Extract ISO year from underlying Date representation.
316
+ #
317
+ # Applies to Date and Datetime columns.
318
+ #
319
+ # Returns the year number in the ISO standard.
320
+ # This may not correspond with the calendar year.
321
+ #
322
+ # @return [Expr]
323
+ def iso_year
324
+ Utils.wrap_expr(_rbexpr.iso_year)
325
+ end
326
+
327
+ # Extract quarter from underlying Date representation.
328
+ #
329
+ # Applies to Date and Datetime columns.
330
+ #
331
+ # Returns the quarter ranging from 1 to 4.
332
+ #
333
+ # @return [Expr]
334
+ #
335
+ # @example
336
+ # start = DateTime.new(2001, 1, 1)
337
+ # stop = DateTime.new(2002, 6, 1)
338
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "180d")})
339
+ # # =>
340
+ # # shape: (3, 1)
341
+ # # ┌─────────────────────┐
342
+ # # │ date │
343
+ # # │ --- │
344
+ # # │ datetime[μs] │
345
+ # # ╞═════════════════════╡
346
+ # # │ 2001-01-01 00:00:00 │
347
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
348
+ # # │ 2001-06-30 00:00:00 │
349
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
350
+ # # │ 2001-12-27 00:00:00 │
351
+ # # └─────────────────────┘
352
+ #
353
+ # @example
354
+ # df.select(Polars.col("date").dt.quarter)
355
+ # # =>
356
+ # # shape: (3, 1)
357
+ # # ┌──────┐
358
+ # # │ date │
359
+ # # │ --- │
360
+ # # │ u32 │
361
+ # # ╞══════╡
362
+ # # │ 1 │
363
+ # # ├╌╌╌╌╌╌┤
364
+ # # │ 2 │
365
+ # # ├╌╌╌╌╌╌┤
366
+ # # │ 4 │
367
+ # # └──────┘
368
+ def quarter
369
+ Utils.wrap_expr(_rbexpr.quarter)
370
+ end
371
+
372
+ # Extract month from underlying Date representation.
373
+ #
374
+ # Applies to Date and Datetime columns.
375
+ #
376
+ # Returns the month number starting from 1.
377
+ # The return value ranges from 1 to 12.
378
+ #
379
+ # @return [Expr]
380
+ #
381
+ # @example
382
+ # start = DateTime.new(2001, 1, 1)
383
+ # stop = DateTime.new(2001, 4, 1)
384
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "31d")})
385
+ # # =>
386
+ # # shape: (3, 1)
387
+ # # ┌─────────────────────┐
388
+ # # │ date │
389
+ # # │ --- │
390
+ # # │ datetime[μs] │
391
+ # # ╞═════════════════════╡
392
+ # # │ 2001-01-01 00:00:00 │
393
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
394
+ # # │ 2001-02-01 00:00:00 │
395
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
396
+ # # │ 2001-03-04 00:00:00 │
397
+ # # └─────────────────────┘
398
+ #
399
+ # @example
400
+ # df.select(Polars.col("date").dt.month)
401
+ # # =>
402
+ # # shape: (3, 1)
403
+ # # ┌──────┐
404
+ # # │ date │
405
+ # # │ --- │
406
+ # # │ u32 │
407
+ # # ╞══════╡
408
+ # # │ 1 │
409
+ # # ├╌╌╌╌╌╌┤
410
+ # # │ 2 │
411
+ # # ├╌╌╌╌╌╌┤
412
+ # # │ 3 │
413
+ # # └──────┘
414
+ def month
415
+ Utils.wrap_expr(_rbexpr.month)
416
+ end
417
+
418
+ # Extract the week from the underlying Date representation.
419
+ #
420
+ # Applies to Date and Datetime columns.
421
+ #
422
+ # Returns the ISO week number starting from 1.
423
+ # The return value ranges from 1 to 53. (The last week of year differs by years.)
424
+ #
425
+ # @return [Expr]
426
+ #
427
+ # @example
428
+ # start = DateTime.new(2001, 1, 1)
429
+ # stop = DateTime.new(2001, 4, 1)
430
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "31d")})
431
+ # # =>
432
+ # # shape: (3, 1)
433
+ # # ┌─────────────────────┐
434
+ # # │ date │
435
+ # # │ --- │
436
+ # # │ datetime[μs] │
437
+ # # ╞═════════════════════╡
438
+ # # │ 2001-01-01 00:00:00 │
439
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
440
+ # # │ 2001-02-01 00:00:00 │
441
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
442
+ # # │ 2001-03-04 00:00:00 │
443
+ # # └─────────────────────┘
444
+ #
445
+ # @example
446
+ # df.select(Polars.col("date").dt.week)
447
+ # # =>
448
+ # # shape: (3, 1)
449
+ # # ┌──────┐
450
+ # # │ date │
451
+ # # │ --- │
452
+ # # │ u32 │
453
+ # # ╞══════╡
454
+ # # │ 1 │
455
+ # # ├╌╌╌╌╌╌┤
456
+ # # │ 5 │
457
+ # # ├╌╌╌╌╌╌┤
458
+ # # │ 9 │
459
+ # # └──────┘
460
+ def week
461
+ Utils.wrap_expr(_rbexpr.week)
462
+ end
463
+
464
+ # Extract the week day from the underlying Date representation.
465
+ #
466
+ # Applies to Date and Datetime columns.
467
+ #
468
+ # Returns the ISO weekday number where monday = 1 and sunday = 7
469
+ #
470
+ # @return [Expr]
471
+ #
472
+ # @example
473
+ # start = DateTime.new(2001, 1, 1)
474
+ # stop = DateTime.new(2001, 1, 9)
475
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "3d")})
476
+ # # =>
477
+ # # shape: (3, 1)
478
+ # # ┌─────────────────────┐
479
+ # # │ date │
480
+ # # │ --- │
481
+ # # │ datetime[μs] │
482
+ # # ╞═════════════════════╡
483
+ # # │ 2001-01-01 00:00:00 │
484
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
485
+ # # │ 2001-01-04 00:00:00 │
486
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
487
+ # # │ 2001-01-07 00:00:00 │
488
+ # # └─────────────────────┘
489
+ #
490
+ # @example
491
+ # df.select(
492
+ # [
493
+ # Polars.col("date").dt.weekday.alias("weekday"),
494
+ # Polars.col("date").dt.day.alias("day_of_month"),
495
+ # Polars.col("date").dt.ordinal_day.alias("day_of_year")
496
+ # ]
497
+ # )
498
+ # # =>
499
+ # # shape: (3, 3)
500
+ # # ┌─────────┬──────────────┬─────────────┐
501
+ # # │ weekday ┆ day_of_month ┆ day_of_year │
502
+ # # │ --- ┆ --- ┆ --- │
503
+ # # │ u32 ┆ u32 ┆ u32 │
504
+ # # ╞═════════╪══════════════╪═════════════╡
505
+ # # │ 1 ┆ 1 ┆ 1 │
506
+ # # ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
507
+ # # │ 4 ┆ 4 ┆ 4 │
508
+ # # ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
509
+ # # │ 7 ┆ 7 ┆ 7 │
510
+ # # └─────────┴──────────────┴─────────────┘
511
+ def weekday
512
+ Utils.wrap_expr(_rbexpr.weekday)
513
+ end
514
+
515
+ # Extract day from underlying Date representation.
516
+ #
517
+ # Applies to Date and Datetime columns.
518
+ #
519
+ # Returns the day of month starting from 1.
520
+ # The return value ranges from 1 to 31. (The last day of month differs by months.)
521
+ #
522
+ # @return [Expr]
523
+ #
524
+ # @example
525
+ # start = DateTime.new(2001, 1, 1)
526
+ # stop = DateTime.new(2001, 1, 9)
527
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "3d")})
528
+ # # =>
529
+ # # shape: (3, 1)
530
+ # # ┌─────────────────────┐
531
+ # # │ date │
532
+ # # │ --- │
533
+ # # │ datetime[μs] │
534
+ # # ╞═════════════════════╡
535
+ # # │ 2001-01-01 00:00:00 │
536
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
537
+ # # │ 2001-01-04 00:00:00 │
538
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
539
+ # # │ 2001-01-07 00:00:00 │
540
+ # # └─────────────────────┘
541
+ #
542
+ # @example
543
+ # df.select(
544
+ # [
545
+ # Polars.col("date").dt.weekday.alias("weekday"),
546
+ # Polars.col("date").dt.day.alias("day_of_month"),
547
+ # Polars.col("date").dt.ordinal_day.alias("day_of_year")
548
+ # ]
549
+ # )
550
+ # # =>
551
+ # # shape: (3, 3)
552
+ # # ┌─────────┬──────────────┬─────────────┐
553
+ # # │ weekday ┆ day_of_month ┆ day_of_year │
554
+ # # │ --- ┆ --- ┆ --- │
555
+ # # │ u32 ┆ u32 ┆ u32 │
556
+ # # ╞═════════╪══════════════╪═════════════╡
557
+ # # │ 1 ┆ 1 ┆ 1 │
558
+ # # ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
559
+ # # │ 4 ┆ 4 ┆ 4 │
560
+ # # ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
561
+ # # │ 7 ┆ 7 ┆ 7 │
562
+ # # └─────────┴──────────────┴─────────────┘
563
+ def day
564
+ Utils.wrap_expr(_rbexpr.day)
565
+ end
566
+
567
+ # Extract ordinal day from underlying Date representation.
568
+ #
569
+ # Applies to Date and Datetime columns.
570
+ #
571
+ # Returns the day of month starting from 1.
572
+ # The return value ranges from 1 to 31. (The last day of month differs by months.)
573
+ #
574
+ # @return [Expr]
575
+ #
576
+ # @example
577
+ # start = DateTime.new(2001, 1, 1)
578
+ # stop = DateTime.new(2001, 1, 9)
579
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "3d")})
580
+ # # =>
581
+ # # shape: (3, 1)
582
+ # # ┌─────────────────────┐
583
+ # # │ date │
584
+ # # │ --- │
585
+ # # │ datetime[μs] │
586
+ # # ╞═════════════════════╡
587
+ # # │ 2001-01-01 00:00:00 │
588
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
589
+ # # │ 2001-01-04 00:00:00 │
590
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
591
+ # # │ 2001-01-07 00:00:00 │
592
+ # # └─────────────────────┘
593
+ #
594
+ # @example
595
+ # df.select(
596
+ # [
597
+ # Polars.col("date").dt.weekday.alias("weekday"),
598
+ # Polars.col("date").dt.day.alias("day_of_month"),
599
+ # Polars.col("date").dt.ordinal_day.alias("day_of_year")
600
+ # ]
601
+ # )
602
+ # # =>
603
+ # # shape: (3, 3)
604
+ # # ┌─────────┬──────────────┬─────────────┐
605
+ # # │ weekday ┆ day_of_month ┆ day_of_year │
606
+ # # │ --- ┆ --- ┆ --- │
607
+ # # │ u32 ┆ u32 ┆ u32 │
608
+ # # ╞═════════╪══════════════╪═════════════╡
609
+ # # │ 1 ┆ 1 ┆ 1 │
610
+ # # ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
611
+ # # │ 4 ┆ 4 ┆ 4 │
612
+ # # ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
613
+ # # │ 7 ┆ 7 ┆ 7 │
614
+ # # └─────────┴──────────────┴─────────────┘
615
+ def ordinal_day
616
+ Utils.wrap_expr(_rbexpr.ordinal_day)
617
+ end
618
+
619
+ # Extract hour from underlying DateTime representation.
620
+ #
621
+ # Applies to Datetime columns.
622
+ #
623
+ # Returns the hour number from 0 to 23.
624
+ #
625
+ # @return [Expr]
626
+ #
627
+ # @example
628
+ # start = DateTime.new(2001, 1, 1)
629
+ # stop = DateTime.new(2001, 1, 2)
630
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "12h")})
631
+ # # =>
632
+ # # shape: (3, 1)
633
+ # # ┌─────────────────────┐
634
+ # # │ date │
635
+ # # │ --- │
636
+ # # │ datetime[μs] │
637
+ # # ╞═════════════════════╡
638
+ # # │ 2001-01-01 00:00:00 │
639
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
640
+ # # │ 2001-01-01 12:00:00 │
641
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
642
+ # # │ 2001-01-02 00:00:00 │
643
+ # # └─────────────────────┘
644
+ #
645
+ # @example
646
+ # df.select(Polars.col("date").dt.hour)
647
+ # # =>
648
+ # # shape: (3, 1)
649
+ # # ┌──────┐
650
+ # # │ date │
651
+ # # │ --- │
652
+ # # │ u32 │
653
+ # # ╞══════╡
654
+ # # │ 0 │
655
+ # # ├╌╌╌╌╌╌┤
656
+ # # │ 12 │
657
+ # # ├╌╌╌╌╌╌┤
658
+ # # │ 0 │
659
+ # # └──────┘
660
+ def hour
661
+ Utils.wrap_expr(_rbexpr.hour)
662
+ end
663
+
664
+ # Extract minutes from underlying DateTime representation.
665
+ #
666
+ # Applies to Datetime columns.
667
+ #
668
+ # Returns the minute number from 0 to 59.
669
+ #
670
+ # @return [Expr]
671
+ #
672
+ # @example
673
+ # start = DateTime.new(2001, 1, 1)
674
+ # stop = DateTime.new(2001, 1, 1, 0, 4, 0)
675
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "2m")})
676
+ # # =>
677
+ # # shape: (3, 1)
678
+ # # ┌─────────────────────┐
679
+ # # │ date │
680
+ # # │ --- │
681
+ # # │ datetime[μs] │
682
+ # # ╞═════════════════════╡
683
+ # # │ 2001-01-01 00:00:00 │
684
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
685
+ # # │ 2001-01-01 00:02:00 │
686
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
687
+ # # │ 2001-01-01 00:04:00 │
688
+ # # └─────────────────────┘
689
+ #
690
+ # @example
691
+ # df.select(Polars.col("date").dt.minute)
692
+ # # =>
693
+ # # shape: (3, 1)
694
+ # # ┌──────┐
695
+ # # │ date │
696
+ # # │ --- │
697
+ # # │ u32 │
698
+ # # ╞══════╡
699
+ # # │ 0 │
700
+ # # ├╌╌╌╌╌╌┤
701
+ # # │ 2 │
702
+ # # ├╌╌╌╌╌╌┤
703
+ # # │ 4 │
704
+ # # └──────┘
705
+ def minute
706
+ Utils.wrap_expr(_rbexpr.minute)
707
+ end
708
+
709
+ # Extract seconds from underlying DateTime representation.
710
+ #
711
+ # Applies to Datetime columns.
712
+ #
713
+ # Returns the integer second number from 0 to 59, or a floating
714
+ # point number from 0 < 60 if `fractional: true` that includes
715
+ # any milli/micro/nanosecond component.
716
+ #
717
+ # @return [Expr]
718
+ #
719
+ # @example
720
+ # df = Polars::DataFrame.new(
721
+ # {
722
+ # "date" => Polars.date_range(
723
+ # DateTime.new(2001, 1, 1, 0, 0, 0.456789),
724
+ # DateTime.new(2001, 1, 1, 0, 0, 6),
725
+ # "2s654321us"
726
+ # )
727
+ # }
728
+ # )
729
+ # # =>
730
+ # # shape: (3, 1)
731
+ # # ┌────────────────────────────┐
732
+ # # │ date │
733
+ # # │ --- │
734
+ # # │ datetime[μs] │
735
+ # # ╞════════════════════════════╡
736
+ # # │ 2001-01-01 00:00:00.456789 │
737
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
738
+ # # │ 2001-01-01 00:00:03.111110 │
739
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
740
+ # # │ 2001-01-01 00:00:05.765431 │
741
+ # # └────────────────────────────┘
742
+ #
743
+ # @example
744
+ # df.select(Polars.col("date").dt.second.alias("secs"))
745
+ # # =>
746
+ # # shape: (3, 1)
747
+ # # ┌──────┐
748
+ # # │ secs │
749
+ # # │ --- │
750
+ # # │ u32 │
751
+ # # ╞══════╡
752
+ # # │ 0 │
753
+ # # ├╌╌╌╌╌╌┤
754
+ # # │ 3 │
755
+ # # ├╌╌╌╌╌╌┤
756
+ # # │ 5 │
757
+ # # └──────┘
758
+ #
759
+ # df.select(Polars.col("date").dt.second(fractional: true).alias("secs"))
760
+ # # =>
761
+ # # shape: (3, 1)
762
+ # # ┌──────────┐
763
+ # # │ secs │
764
+ # # │ --- │
765
+ # # │ f64 │
766
+ # # ╞══════════╡
767
+ # # │ 0.456789 │
768
+ # # ├╌╌╌╌╌╌╌╌╌╌┤
769
+ # # │ 3.11111 │
770
+ # # ├╌╌╌╌╌╌╌╌╌╌┤
771
+ # # │ 5.765431 │
772
+ # # └──────────┘
773
+ #
774
+ # @example
775
+ # start = DateTime.new(2001, 1, 1)
776
+ # stop = DateTime.new(2001, 1, 1, 0, 0, 4)
777
+ # df = Polars::DataFrame.new(
778
+ # {"date" => Polars.date_range(start, stop, "2s")}
779
+ # )
780
+ # # =>
781
+ # # shape: (3, 1)
782
+ # # ┌─────────────────────┐
783
+ # # │ date │
784
+ # # │ --- │
785
+ # # │ datetime[μs] │
786
+ # # ╞═════════════════════╡
787
+ # # │ 2001-01-01 00:00:00 │
788
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
789
+ # # │ 2001-01-01 00:00:02 │
790
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
791
+ # # │ 2001-01-01 00:00:04 │
792
+ # # └─────────────────────┘
793
+ #
794
+ # @example
795
+ # df.select(Polars.col("date").dt.second)
796
+ # # =>
797
+ # # shape: (3, 1)
798
+ # # ┌──────┐
799
+ # # │ date │
800
+ # # │ --- │
801
+ # # │ u32 │
802
+ # # ╞══════╡
803
+ # # │ 0 │
804
+ # # ├╌╌╌╌╌╌┤
805
+ # # │ 2 │
806
+ # # ├╌╌╌╌╌╌┤
807
+ # # │ 4 │
808
+ # # └──────┘
809
+ def second(fractional: false)
810
+ sec = Utils.wrap_expr(_rbexpr.second)
811
+ if fractional
812
+ sec + (Utils.wrap_expr(_rbexpr.nanosecond) / Utils.lit(1_000_000_000.0))
813
+ else
814
+ sec
815
+ end
816
+ end
817
+
818
+ # Extract milliseconds from underlying DateTime representation.
819
+ #
820
+ # Applies to Datetime columns.
821
+ #
822
+ # @return [Expr]
823
+ def millisecond
824
+ Utils.wrap_expr(_rbexpr.millisecond)
825
+ end
826
+
827
+ # Extract microseconds from underlying DateTime representation.
828
+ #
829
+ # Applies to Datetime columns.
830
+ #
831
+ # @return [Expr]
832
+ def microsecond
833
+ Utils.wrap_expr(_rbexpr.microsecond)
834
+ end
835
+
836
+ # Extract nanoseconds from underlying DateTime representation.
837
+ #
838
+ # Applies to Datetime columns.
839
+ #
840
+ # @return [Expr]
841
+ def nanosecond
842
+ Utils.wrap_expr(_rbexpr.nanosecond)
843
+ end
844
+
845
+ # Get the time passed since the Unix EPOCH in the give time unit.
846
+ #
847
+ # @param tu ["us", "ns", "ms", "s", "d"]
848
+ # Time unit.
849
+ #
850
+ # @return [Expr]
851
+ #
852
+ # @example
853
+ # start = DateTime.new(2001, 1, 1)
854
+ # stop = DateTime.new(2001, 1, 3)
855
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "1d")})
856
+ # df.select(
857
+ # [
858
+ # Polars.col("date"),
859
+ # Polars.col("date").dt.epoch.alias("epoch_ns"),
860
+ # Polars.col("date").dt.epoch("s").alias("epoch_s")
861
+ # ]
862
+ # )
863
+ # # =>
864
+ # # shape: (3, 3)
865
+ # # ┌─────────────────────┬─────────────────┬───────────┐
866
+ # # │ date ┆ epoch_ns ┆ epoch_s │
867
+ # # │ --- ┆ --- ┆ --- │
868
+ # # │ datetime[μs] ┆ i64 ┆ i64 │
869
+ # # ╞═════════════════════╪═════════════════╪═══════════╡
870
+ # # │ 2001-01-01 00:00:00 ┆ 978307200000000 ┆ 978307200 │
871
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
872
+ # # │ 2001-01-02 00:00:00 ┆ 978393600000000 ┆ 978393600 │
873
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
874
+ # # │ 2001-01-03 00:00:00 ┆ 978480000000000 ┆ 978480000 │
875
+ # # └─────────────────────┴─────────────────┴───────────┘
876
+ def epoch(tu = "us")
877
+ if Utils::DTYPE_TEMPORAL_UNITS.include?(tu)
878
+ timestamp(tu)
879
+ elsif tu == "s"
880
+ Utils.wrap_expr(_rbexpr.dt_epoch_seconds)
881
+ elsif tu == "d"
882
+ Utils.wrap_expr(_rbexpr).cast(:date).cast(:i32)
883
+ else
884
+ raise ArgumentError, "tu must be one of {{'ns', 'us', 'ms', 's', 'd'}}, got #{tu}"
885
+ end
886
+ end
887
+
888
+ # Return a timestamp in the given time unit.
889
+ #
890
+ # @param tu ["us", "ns", "ms"]
891
+ # Time unit.
892
+ #
893
+ # @return [Expr]
894
+ #
895
+ # @example
896
+ # start = DateTime.new(2001, 1, 1)
897
+ # stop = DateTime.new(2001, 1, 3)
898
+ # df = Polars::DataFrame.new({"date" => Polars.date_range(start, stop, "1d")})
899
+ # df.select(
900
+ # [
901
+ # Polars.col("date"),
902
+ # Polars.col("date").dt.timestamp.alias("timestamp_ns"),
903
+ # Polars.col("date").dt.timestamp("ms").alias("timestamp_ms")
904
+ # ]
905
+ # )
906
+ # # =>
907
+ # # shape: (3, 3)
908
+ # # ┌─────────────────────┬─────────────────┬──────────────┐
909
+ # # │ date ┆ timestamp_ns ┆ timestamp_ms │
910
+ # # │ --- ┆ --- ┆ --- │
911
+ # # │ datetime[μs] ┆ i64 ┆ i64 │
912
+ # # ╞═════════════════════╪═════════════════╪══════════════╡
913
+ # # │ 2001-01-01 00:00:00 ┆ 978307200000000 ┆ 978307200000 │
914
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
915
+ # # │ 2001-01-02 00:00:00 ┆ 978393600000000 ┆ 978393600000 │
916
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
917
+ # # │ 2001-01-03 00:00:00 ┆ 978480000000000 ┆ 978480000000 │
918
+ # # └─────────────────────┴─────────────────┴──────────────┘
919
+ def timestamp(tu = "us")
920
+ Utils.wrap_expr(_rbexpr.timestamp(tu))
921
+ end
922
+
923
+ # Set time unit of a Series of dtype Datetime or Duration.
924
+ #
925
+ # This does not modify underlying data, and should be used to fix an incorrect
926
+ # time unit.
927
+ #
928
+ # @param tu ["ns", "us", "ms"]
929
+ # Time unit for the `Datetime` Series.
930
+ #
931
+ # @return [Expr]
932
+ #
933
+ # @example
934
+ # df = Polars::DataFrame.new(
935
+ # {
936
+ # "date" => Polars.date_range(
937
+ # DateTime.new(2001, 1, 1), DateTime.new(2001, 1, 3), "1d", time_unit: "ns"
938
+ # )
939
+ # }
940
+ # )
941
+ # df.select(
942
+ # [
943
+ # Polars.col("date"),
944
+ # Polars.col("date").dt.with_time_unit("us").alias("tu_us")
945
+ # ]
946
+ # )
947
+ # # =>
948
+ # # shape: (3, 2)
949
+ # # ┌─────────────────────┬───────────────────────┐
950
+ # # │ date ┆ tu_us │
951
+ # # │ --- ┆ --- │
952
+ # # │ datetime[ns] ┆ datetime[μs] │
953
+ # # ╞═════════════════════╪═══════════════════════╡
954
+ # # │ 2001-01-01 00:00:00 ┆ +32971-04-28 00:00:00 │
955
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
956
+ # # │ 2001-01-02 00:00:00 ┆ +32974-01-22 00:00:00 │
957
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
958
+ # # │ 2001-01-03 00:00:00 ┆ +32976-10-18 00:00:00 │
959
+ # # └─────────────────────┴───────────────────────┘
960
+ def with_time_unit(tu)
961
+ Utils.wrap_expr(_rbexpr.dt_with_time_unit(tu))
962
+ end
963
+
964
+ # Cast the underlying data to another time unit. This may lose precision.
965
+ #
966
+ # @param tu ["ns", "us", "ms"]
967
+ # Time unit for the `Datetime` Series.
968
+ #
969
+ # @return [Expr]
970
+ #
971
+ # @example
972
+ # df = Polars::DataFrame.new(
973
+ # {
974
+ # "date" => Polars.date_range(
975
+ # DateTime.new(2001, 1, 1), DateTime.new(2001, 1, 3), "1d"
976
+ # )
977
+ # }
978
+ # )
979
+ # df.select(
980
+ # [
981
+ # Polars.col("date"),
982
+ # Polars.col("date").dt.cast_time_unit("ms").alias("tu_ms"),
983
+ # Polars.col("date").dt.cast_time_unit("ns").alias("tu_ns")
984
+ # ]
985
+ # )
986
+ # # =>
987
+ # # shape: (3, 3)
988
+ # # ┌─────────────────────┬─────────────────────┬─────────────────────┐
989
+ # # │ date ┆ tu_ms ┆ tu_ns │
990
+ # # │ --- ┆ --- ┆ --- │
991
+ # # │ datetime[μs] ┆ datetime[ms] ┆ datetime[ns] │
992
+ # # ╞═════════════════════╪═════════════════════╪═════════════════════╡
993
+ # # │ 2001-01-01 00:00:00 ┆ 2001-01-01 00:00:00 ┆ 2001-01-01 00:00:00 │
994
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
995
+ # # │ 2001-01-02 00:00:00 ┆ 2001-01-02 00:00:00 ┆ 2001-01-02 00:00:00 │
996
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
997
+ # # │ 2001-01-03 00:00:00 ┆ 2001-01-03 00:00:00 ┆ 2001-01-03 00:00:00 │
998
+ # # └─────────────────────┴─────────────────────┴─────────────────────┘
999
+ def cast_time_unit(tu)
1000
+ Utils.wrap_expr(_rbexpr.dt_cast_time_unit(tu))
1001
+ end
1002
+
1003
+ # Set time zone for a Series of type Datetime.
1004
+ #
1005
+ # @param tz [String]
1006
+ # Time zone for the `Datetime` Series.
1007
+ #
1008
+ # @return [Expr]
1009
+ #
1010
+ # @example
1011
+ # df = Polars::DataFrame.new(
1012
+ # {
1013
+ # "date" => Polars.date_range(
1014
+ # DateTime.new(2020, 3, 1), DateTime.new(2020, 5, 1), "1mo"
1015
+ # )
1016
+ # }
1017
+ # )
1018
+ # df.select(
1019
+ # [
1020
+ # Polars.col("date"),
1021
+ # Polars.col("date")
1022
+ # .dt.with_time_zone("Europe/London")
1023
+ # .alias("London")
1024
+ # ]
1025
+ # )
1026
+ # # =>
1027
+ # # shape: (3, 2)
1028
+ # # ┌─────────────────────┬─────────────────────────────┐
1029
+ # # │ date ┆ London │
1030
+ # # │ --- ┆ --- │
1031
+ # # │ datetime[μs] ┆ datetime[μs, Europe/London] │
1032
+ # # ╞═════════════════════╪═════════════════════════════╡
1033
+ # # │ 2020-03-01 00:00:00 ┆ 2020-03-01 00:00:00 GMT │
1034
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1035
+ # # │ 2020-04-01 00:00:00 ┆ 2020-04-01 01:00:00 BST │
1036
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1037
+ # # │ 2020-05-01 00:00:00 ┆ 2020-05-01 01:00:00 BST │
1038
+ # # └─────────────────────┴─────────────────────────────┘
1039
+ def with_time_zone(tz)
1040
+ Utils.wrap_expr(_rbexpr.dt_with_time_zone(tz))
1041
+ end
1042
+
1043
+ # Cast time zone for a Series of type Datetime.
1044
+ #
1045
+ # Different from `with_time_zone`, this will also modify
1046
+ # the underlying timestamp,
1047
+ #
1048
+ # @param tz [String]
1049
+ # Time zone for the `Datetime` Series.
1050
+ #
1051
+ # @return [Expr]
1052
+ def cast_time_zone(tz)
1053
+ Utils.wrap_expr(_rbexpr.dt_cast_time_zone(tz))
1054
+ end
1055
+
1056
+ # Localize tz-naive Datetime Series to tz-aware Datetime Series.
1057
+ #
1058
+ # This method takes a naive Datetime Series and makes this time zone aware.
1059
+ # It does not move the time to another time zone.
1060
+ #
1061
+ # @param tz [String]
1062
+ # Time zone for the `Datetime` Series.
1063
+ #
1064
+ # @return [Expr]
1065
+ def tz_localize(tz)
1066
+ Utils.wrap_expr(_rbexpr.dt_tz_localize(tz))
1067
+ end
1068
+
1069
+ # Extract the days from a Duration type.
1070
+ #
1071
+ # @return [Expr]
1072
+ #
1073
+ # @example
1074
+ # df = Polars::DataFrame.new(
1075
+ # {
1076
+ # "date" => Polars.date_range(
1077
+ # DateTime.new(2020, 3, 1), DateTime.new(2020, 5, 1), "1mo"
1078
+ # )
1079
+ # }
1080
+ # )
1081
+ # df.select(
1082
+ # [
1083
+ # Polars.col("date"),
1084
+ # Polars.col("date").diff.dt.days.alias("days_diff")
1085
+ # ]
1086
+ # )
1087
+ # # =>
1088
+ # # shape: (3, 2)
1089
+ # # ┌─────────────────────┬───────────┐
1090
+ # # │ date ┆ days_diff │
1091
+ # # │ --- ┆ --- │
1092
+ # # │ datetime[μs] ┆ i64 │
1093
+ # # ╞═════════════════════╪═══════════╡
1094
+ # # │ 2020-03-01 00:00:00 ┆ null │
1095
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
1096
+ # # │ 2020-04-01 00:00:00 ┆ 31 │
1097
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
1098
+ # # │ 2020-05-01 00:00:00 ┆ 30 │
1099
+ # # └─────────────────────┴───────────┘
1100
+ def days
1101
+ Utils.wrap_expr(_rbexpr.duration_days)
1102
+ end
1103
+
1104
+ # Extract the hours from a Duration type.
1105
+ #
1106
+ # @return [Expr]
1107
+ #
1108
+ # @example
1109
+ # df = Polars::DataFrame.new(
1110
+ # {
1111
+ # "date" => Polars.date_range(
1112
+ # DateTime.new(2020, 1, 1), DateTime.new(2020, 1, 4), "1d"
1113
+ # )
1114
+ # }
1115
+ # )
1116
+ # df.select(
1117
+ # [
1118
+ # Polars.col("date"),
1119
+ # Polars.col("date").diff.dt.hours.alias("hours_diff")
1120
+ # ]
1121
+ # )
1122
+ # # =>
1123
+ # # shape: (4, 2)
1124
+ # # ┌─────────────────────┬────────────┐
1125
+ # # │ date ┆ hours_diff │
1126
+ # # │ --- ┆ --- │
1127
+ # # │ datetime[μs] ┆ i64 │
1128
+ # # ╞═════════════════════╪════════════╡
1129
+ # # │ 2020-01-01 00:00:00 ┆ null │
1130
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
1131
+ # # │ 2020-01-02 00:00:00 ┆ 24 │
1132
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
1133
+ # # │ 2020-01-03 00:00:00 ┆ 24 │
1134
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
1135
+ # # │ 2020-01-04 00:00:00 ┆ 24 │
1136
+ # # └─────────────────────┴────────────┘
1137
+ def hours
1138
+ Utils.wrap_expr(_rbexpr.duration_hours)
1139
+ end
1140
+
1141
+ # Extract the minutes from a Duration type.
1142
+ #
1143
+ # @return [Expr]
1144
+ #
1145
+ # @example
1146
+ # df = Polars::DataFrame.new(
1147
+ # {
1148
+ # "date" => Polars.date_range(
1149
+ # DateTime.new(2020, 1, 1), DateTime.new(2020, 1, 4), "1d"
1150
+ # )
1151
+ # }
1152
+ # )
1153
+ # df.select(
1154
+ # [
1155
+ # Polars.col("date"),
1156
+ # Polars.col("date").diff.dt.minutes.alias("minutes_diff")
1157
+ # ]
1158
+ # )
1159
+ # # =>
1160
+ # # shape: (4, 2)
1161
+ # # ┌─────────────────────┬──────────────┐
1162
+ # # │ date ┆ minutes_diff │
1163
+ # # │ --- ┆ --- │
1164
+ # # │ datetime[μs] ┆ i64 │
1165
+ # # ╞═════════════════════╪══════════════╡
1166
+ # # │ 2020-01-01 00:00:00 ┆ null │
1167
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1168
+ # # │ 2020-01-02 00:00:00 ┆ 1440 │
1169
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1170
+ # # │ 2020-01-03 00:00:00 ┆ 1440 │
1171
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1172
+ # # │ 2020-01-04 00:00:00 ┆ 1440 │
1173
+ # # └─────────────────────┴──────────────┘
1174
+ def minutes
1175
+ Utils.wrap_expr(_rbexpr.duration_minutes)
1176
+ end
1177
+
1178
+ # Extract the seconds from a Duration type.
1179
+ #
1180
+ # @return [Expr]
1181
+ #
1182
+ # @example
1183
+ # df = Polars::DataFrame.new(
1184
+ # {
1185
+ # "date" => Polars.date_range(
1186
+ # DateTime.new(2020, 1, 1), DateTime.new(2020, 1, 1, 0, 4, 0), "1m"
1187
+ # )
1188
+ # }
1189
+ # )
1190
+ # df.select(
1191
+ # [
1192
+ # Polars.col("date"),
1193
+ # Polars.col("date").diff.dt.seconds.alias("seconds_diff")
1194
+ # ]
1195
+ # )
1196
+ # # =>
1197
+ # # shape: (5, 2)
1198
+ # # ┌─────────────────────┬──────────────┐
1199
+ # # │ date ┆ seconds_diff │
1200
+ # # │ --- ┆ --- │
1201
+ # # │ datetime[μs] ┆ i64 │
1202
+ # # ╞═════════════════════╪══════════════╡
1203
+ # # │ 2020-01-01 00:00:00 ┆ null │
1204
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1205
+ # # │ 2020-01-01 00:01:00 ┆ 60 │
1206
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1207
+ # # │ 2020-01-01 00:02:00 ┆ 60 │
1208
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1209
+ # # │ 2020-01-01 00:03:00 ┆ 60 │
1210
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1211
+ # # │ 2020-01-01 00:04:00 ┆ 60 │
1212
+ # # └─────────────────────┴──────────────┘
1213
+ def seconds
1214
+ Utils.wrap_expr(_rbexpr.duration_seconds)
1215
+ end
1216
+
1217
+ # Extract the milliseconds from a Duration type.
1218
+ #
1219
+ # @return [Expr]
1220
+ #
1221
+ # @example
1222
+ # df = Polars::DataFrame.new(
1223
+ # {
1224
+ # "date" => Polars.date_range(
1225
+ # DateTime.new(2020, 1, 1), DateTime.new(2020, 1, 1, 0, 0, 1), "1ms"
1226
+ # )
1227
+ # }
1228
+ # )
1229
+ # df.select(
1230
+ # [
1231
+ # Polars.col("date"),
1232
+ # Polars.col("date").diff.dt.milliseconds.alias("milliseconds_diff")
1233
+ # ]
1234
+ # )
1235
+ # # =>
1236
+ # # shape: (1001, 2)
1237
+ # # ┌─────────────────────────┬───────────────────┐
1238
+ # # │ date ┆ milliseconds_diff │
1239
+ # # │ --- ┆ --- │
1240
+ # # │ datetime[μs] ┆ i64 │
1241
+ # # ╞═════════════════════════╪═══════════════════╡
1242
+ # # │ 2020-01-01 00:00:00 ┆ null │
1243
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1244
+ # # │ 2020-01-01 00:00:00.001 ┆ 1 │
1245
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1246
+ # # │ 2020-01-01 00:00:00.002 ┆ 1 │
1247
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1248
+ # # │ 2020-01-01 00:00:00.003 ┆ 1 │
1249
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1250
+ # # │ ... ┆ ... │
1251
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1252
+ # # │ 2020-01-01 00:00:00.997 ┆ 1 │
1253
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1254
+ # # │ 2020-01-01 00:00:00.998 ┆ 1 │
1255
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1256
+ # # │ 2020-01-01 00:00:00.999 ┆ 1 │
1257
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1258
+ # # │ 2020-01-01 00:00:01 ┆ 1 │
1259
+ # # └─────────────────────────┴───────────────────┘
1260
+ def milliseconds
1261
+ Utils.wrap_expr(_rbexpr.duration_milliseconds)
1262
+ end
1263
+
1264
+ # Extract the microseconds from a Duration type.
1265
+ #
1266
+ # @return [Expr]
1267
+ #
1268
+ # @example
1269
+ # df = Polars::DataFrame.new(
1270
+ # {
1271
+ # "date" => Polars.date_range(
1272
+ # DateTime.new(2020, 1, 1), DateTime.new(2020, 1, 1, 0, 0, 1), "1ms"
1273
+ # )
1274
+ # }
1275
+ # )
1276
+ # df.select(
1277
+ # [
1278
+ # Polars.col("date"),
1279
+ # Polars.col("date").diff.dt.microseconds.alias("microseconds_diff")
1280
+ # ]
1281
+ # )
1282
+ # # =>
1283
+ # # shape: (1001, 2)
1284
+ # # ┌─────────────────────────┬───────────────────┐
1285
+ # # │ date ┆ microseconds_diff │
1286
+ # # │ --- ┆ --- │
1287
+ # # │ datetime[μs] ┆ i64 │
1288
+ # # ╞═════════════════════════╪═══════════════════╡
1289
+ # # │ 2020-01-01 00:00:00 ┆ null │
1290
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1291
+ # # │ 2020-01-01 00:00:00.001 ┆ 1000 │
1292
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1293
+ # # │ 2020-01-01 00:00:00.002 ┆ 1000 │
1294
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1295
+ # # │ 2020-01-01 00:00:00.003 ┆ 1000 │
1296
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1297
+ # # │ ... ┆ ... │
1298
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1299
+ # # │ 2020-01-01 00:00:00.997 ┆ 1000 │
1300
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1301
+ # # │ 2020-01-01 00:00:00.998 ┆ 1000 │
1302
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1303
+ # # │ 2020-01-01 00:00:00.999 ┆ 1000 │
1304
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1305
+ # # │ 2020-01-01 00:00:01 ┆ 1000 │
1306
+ # # └─────────────────────────┴───────────────────┘
1307
+ def microseconds
1308
+ Utils.wrap_expr(_rbexpr.duration_microseconds)
1309
+ end
1310
+
1311
+ # Extract the nanoseconds from a Duration type.
1312
+ #
1313
+ # @return [Expr]
1314
+ #
1315
+ # @example
1316
+ # df = Polars::DataFrame.new(
1317
+ # {
1318
+ # "date" => Polars.date_range(
1319
+ # DateTime.new(2020, 1, 1), DateTime.new(2020, 1, 1, 0, 0, 1), "1ms"
1320
+ # )
1321
+ # }
1322
+ # )
1323
+ # df.select(
1324
+ # [
1325
+ # Polars.col("date"),
1326
+ # Polars.col("date").diff.dt.nanoseconds.alias("nanoseconds_diff")
1327
+ # ]
1328
+ # )
1329
+ # # =>
1330
+ # # shape: (1001, 2)
1331
+ # # ┌─────────────────────────┬──────────────────┐
1332
+ # # │ date ┆ nanoseconds_diff │
1333
+ # # │ --- ┆ --- │
1334
+ # # │ datetime[μs] ┆ i64 │
1335
+ # # ╞═════════════════════════╪══════════════════╡
1336
+ # # │ 2020-01-01 00:00:00 ┆ null │
1337
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1338
+ # # │ 2020-01-01 00:00:00.001 ┆ 1000000 │
1339
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1340
+ # # │ 2020-01-01 00:00:00.002 ┆ 1000000 │
1341
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1342
+ # # │ 2020-01-01 00:00:00.003 ┆ 1000000 │
1343
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1344
+ # # │ ... ┆ ... │
1345
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1346
+ # # │ 2020-01-01 00:00:00.997 ┆ 1000000 │
1347
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1348
+ # # │ 2020-01-01 00:00:00.998 ┆ 1000000 │
1349
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1350
+ # # │ 2020-01-01 00:00:00.999 ┆ 1000000 │
1351
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1352
+ # # │ 2020-01-01 00:00:01 ┆ 1000000 │
1353
+ # # └─────────────────────────┴──────────────────┘
1354
+ def nanoseconds
1355
+ Utils.wrap_expr(_rbexpr.duration_nanoseconds)
1356
+ end
1357
+
1358
+ # Offset this date by a relative time offset.
1359
+ #
1360
+ # This differs from `Polars.col("foo") + timedelta` in that it can
1361
+ # take months and leap years into account. Note that only a single minus
1362
+ # sign is allowed in the `by` string, as the first character.
1363
+ #
1364
+ # @param by [String]
1365
+ # The offset is dictated by the following string language:
1366
+ #
1367
+ # - 1ns (1 nanosecond)
1368
+ # - 1us (1 microsecond)
1369
+ # - 1ms (1 millisecond)
1370
+ # - 1s (1 second)
1371
+ # - 1m (1 minute)
1372
+ # - 1h (1 hour)
1373
+ # - 1d (1 day)
1374
+ # - 1w (1 week)
1375
+ # - 1mo (1 calendar month)
1376
+ # - 1y (1 calendar year)
1377
+ # - 1i (1 index count)
1378
+ #
1379
+ # @return [Expr]
1380
+ #
1381
+ # @example
1382
+ # df = Polars::DataFrame.new(
1383
+ # {
1384
+ # "dates" => Polars.date_range(
1385
+ # DateTime.new(2000, 1, 1), DateTime.new(2005, 1, 1), "1y"
1386
+ # )
1387
+ # }
1388
+ # )
1389
+ # df.select(
1390
+ # [
1391
+ # Polars.col("dates").dt.offset_by("1y").alias("date_plus_1y"),
1392
+ # Polars.col("dates").dt.offset_by("-1y2mo").alias("date_min")
1393
+ # ]
1394
+ # )
1395
+ # # =>
1396
+ # # shape: (6, 2)
1397
+ # # ┌─────────────────────┬─────────────────────┐
1398
+ # # │ date_plus_1y ┆ date_min │
1399
+ # # │ --- ┆ --- │
1400
+ # # │ datetime[μs] ┆ datetime[μs] │
1401
+ # # ╞═════════════════════╪═════════════════════╡
1402
+ # # │ 2001-01-01 00:00:00 ┆ 1998-11-01 00:00:00 │
1403
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1404
+ # # │ 2002-01-01 00:00:00 ┆ 1999-11-01 00:00:00 │
1405
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1406
+ # # │ 2003-01-01 00:00:00 ┆ 2000-11-01 00:00:00 │
1407
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1408
+ # # │ 2004-01-01 00:00:00 ┆ 2001-11-01 00:00:00 │
1409
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1410
+ # # │ 2005-01-01 00:00:00 ┆ 2002-11-01 00:00:00 │
1411
+ # # ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
1412
+ # # │ 2006-01-01 00:00:00 ┆ 2003-11-01 00:00:00 │
1413
+ # # └─────────────────────┴─────────────────────┘
1414
+ def offset_by(by)
1415
+ Utils.wrap_expr(_rbexpr.dt_offset_by(by))
1416
+ end
1417
+ end
1418
+ end