Skip to content

Commit 1b6e2af

Browse files
committed
Plumb pylibcudf datetime APIs through cudf python
1 parent 2db58d5 commit 1b6e2af

File tree

1 file changed

+70
-107
lines changed

1 file changed

+70
-107
lines changed

python/cudf/cudf/_lib/datetime.pyx

Lines changed: 70 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,29 @@ from libcpp.utility cimport move
99

1010
cimport pylibcudf.libcudf.datetime as libcudf_datetime
1111
from pylibcudf.libcudf.column.column cimport column
12-
from pylibcudf.libcudf.column.column_view cimport column_view
1312
from pylibcudf.libcudf.filling cimport calendrical_month_sequence
1413
from pylibcudf.libcudf.scalar.scalar cimport scalar
1514
from pylibcudf.libcudf.types cimport size_type
16-
from pylibcudf.datetime import DatetimeComponent
15+
from pylibcudf.datetime import DatetimeComponent, RoundingFrequency
1716

1817
from cudf._lib.column cimport Column
1918
from cudf._lib.scalar cimport DeviceScalar
19+
import pylibcudf as plc
2020

2121

2222
@acquire_spill_lock()
2323
def add_months(Column col, Column months):
2424
# months must be int16 dtype
25-
cdef unique_ptr[column] c_result
26-
cdef column_view col_view = col.view()
27-
cdef column_view months_view = months.view()
28-
29-
with nogil:
30-
c_result = move(
31-
libcudf_datetime.add_calendrical_months(
32-
col_view,
33-
months_view
34-
)
25+
return Column.from_pylibcudf(
26+
plc.datetime.add_calendrical_months(
27+
col.to_pylibcudf(mode="read"),
28+
months.to_pylibcudf(mode="read")
3529
)
36-
37-
return Column.from_unique_ptr(move(c_result))
30+
)
3831

3932

4033
@acquire_spill_lock()
4134
def extract_datetime_component(Column col, object field):
42-
43-
cdef unique_ptr[column] c_result
44-
cdef column_view col_view = col.view()
45-
cdef libcudf_datetime.datetime_component component
46-
4735
component_names = {
4836
"year": DatetimeComponent.YEAR,
4937
"month": DatetimeComponent.MONTH,
@@ -57,27 +45,25 @@ def extract_datetime_component(Column col, object field):
5745
"nanosecond": DatetimeComponent.NANOSECOND,
5846
}
5947
if field == "day_of_year":
60-
with nogil:
61-
c_result = move(libcudf_datetime.day_of_year(col_view))
48+
result = Column.from_pylibcudf(
49+
plc.datetime.day_of_year(
50+
col.to_pylibcudf(mode="read")
51+
)
52+
)
6253
elif field in component_names:
63-
component = component_names[field]
64-
with nogil:
65-
c_result = move(
66-
libcudf_datetime.extract_datetime_component(
67-
col_view,
68-
component
69-
)
54+
result = Column.from_pylibcudf(
55+
plc.datetime.extract_datetime_component(
56+
col.to_pylibcudf(mode="read"),
57+
component_names[field],
7058
)
59+
)
60+
if field == "weekday":
61+
# Pandas counts Monday-Sunday as 0-6
62+
# while libcudf counts Monday-Sunday as 1-7
63+
result = result - result.dtype.type(1)
7164
else:
7265
raise ValueError(f"Invalid field: '{field}'")
7366

74-
result = Column.from_unique_ptr(move(c_result))
75-
76-
if field == "weekday":
77-
# Pandas counts Monday-Sunday as 0-6
78-
# while libcudf counts Monday-Sunday as 1-7
79-
result = result - result.dtype.type(1)
80-
8167
return result
8268

8369

@@ -101,78 +87,61 @@ cdef libcudf_datetime.rounding_frequency _get_rounding_frequency(object freq):
10187
FutureWarning
10288
)
10389
freq = old_to_new_freq_map.get(freq)
104-
if freq == "D":
105-
freq_val = libcudf_datetime.rounding_frequency.DAY
106-
elif freq == "h":
107-
freq_val = libcudf_datetime.rounding_frequency.HOUR
108-
elif freq == "min":
109-
freq_val = libcudf_datetime.rounding_frequency.MINUTE
110-
elif freq == "s":
111-
freq_val = libcudf_datetime.rounding_frequency.SECOND
112-
elif freq == "ms":
113-
freq_val = libcudf_datetime.rounding_frequency.MILLISECOND
114-
elif freq == "us":
115-
freq_val = libcudf_datetime.rounding_frequency.MICROSECOND
116-
elif freq == "ns":
117-
freq_val = libcudf_datetime.rounding_frequency.NANOSECOND
90+
rounding_fequency_map = {
91+
"D": RoundingFrequency.DAY,
92+
"h": RoundingFrequency.HOUR,
93+
"min": RoundingFrequency.MINUTE,
94+
"s": RoundingFrequency.SECOND,
95+
"ms": RoundingFrequency.MILLISECOND,
96+
"us": RoundingFrequency.MICROSECOND,
97+
"ns": RoundingFrequency.NANOSECOND,
98+
}
99+
if freq in rounding_fequency_map:
100+
freq_val = rounding_fequency_map[freq]
118101
else:
119102
raise ValueError(f"Invalid resolution: '{freq}'")
120103
return freq_val
121104

122105

123106
@acquire_spill_lock()
124107
def ceil_datetime(Column col, object freq):
125-
cdef unique_ptr[column] c_result
126-
cdef column_view col_view = col.view()
127-
cdef libcudf_datetime.rounding_frequency freq_val = \
128-
_get_rounding_frequency(freq)
129-
130-
with nogil:
131-
c_result = move(libcudf_datetime.ceil_datetimes(col_view, freq_val))
132-
133-
result = Column.from_unique_ptr(move(c_result))
134-
return result
108+
return Column.from_pylibcudf(
109+
plc.datetime.ceil_datetimes(
110+
col.to_pylibcudf(mode="read"),
111+
_get_rounding_frequency(freq),
112+
)
113+
)
135114

136115

137116
@acquire_spill_lock()
138117
def floor_datetime(Column col, object freq):
139-
cdef unique_ptr[column] c_result
140-
cdef column_view col_view = col.view()
141-
cdef libcudf_datetime.rounding_frequency freq_val = \
142-
_get_rounding_frequency(freq)
143-
144-
with nogil:
145-
c_result = move(libcudf_datetime.floor_datetimes(col_view, freq_val))
146-
147-
result = Column.from_unique_ptr(move(c_result))
148-
return result
118+
return Column.from_pylibcudf(
119+
plc.datetime.floor_datetimes(
120+
col.to_pylibcudf(mode="read"),
121+
_get_rounding_frequency(freq),
122+
)
123+
)
149124

150125

151126
@acquire_spill_lock()
152127
def round_datetime(Column col, object freq):
153-
cdef unique_ptr[column] c_result
154-
cdef column_view col_view = col.view()
155-
cdef libcudf_datetime.rounding_frequency freq_val = \
156-
_get_rounding_frequency(freq)
157-
158-
with nogil:
159-
c_result = move(libcudf_datetime.round_datetimes(col_view, freq_val))
160-
161-
result = Column.from_unique_ptr(move(c_result))
162-
return result
128+
return Column.from_pylibcudf(
129+
plc.datetime.round_datetimes(
130+
col.to_pylibcudf(mode="read"),
131+
_get_rounding_frequency(freq),
132+
)
133+
)
163134

164135

165136
@acquire_spill_lock()
166137
def is_leap_year(Column col):
167138
"""Returns a boolean indicator whether the year of the date is a leap year
168139
"""
169-
cdef unique_ptr[column] c_result
170-
cdef column_view col_view = col.view()
171-
172-
with nogil:
173-
c_result = move(libcudf_datetime.is_leap_year(col_view))
174-
175-
return Column.from_unique_ptr(move(c_result))
140+
return Column.from_pylibcudf(
141+
plc.datetime.is_leap_year(
142+
col.to_pylibcudf(mode="read")
143+
)
144+
)
176145

177146

178147
@acquire_spill_lock()
@@ -199,34 +168,28 @@ def extract_quarter(Column col):
199168
Returns a column which contains the corresponding quarter of the year
200169
for every timestamp inside the input column.
201170
"""
202-
cdef unique_ptr[column] c_result
203-
cdef column_view col_view = col.view()
204-
205-
with nogil:
206-
c_result = move(libcudf_datetime.extract_quarter(col_view))
207-
208-
return Column.from_unique_ptr(move(c_result))
171+
return Column.from_pylibcudf(
172+
plc.datetime.extract_quarter(
173+
col.to_pylibcudf(mode="read")
174+
)
175+
)
209176

210177

211178
@acquire_spill_lock()
212179
def days_in_month(Column col):
213180
"""Extracts the number of days in the month of the date
214181
"""
215-
cdef unique_ptr[column] c_result
216-
cdef column_view col_view = col.view()
217-
218-
with nogil:
219-
c_result = move(libcudf_datetime.days_in_month(col_view))
220-
221-
return Column.from_unique_ptr(move(c_result))
182+
return Column.from_pylibcudf(
183+
plc.datetime.days_in_month(
184+
col.to_pylibcudf(mode="read")
185+
)
186+
)
222187

223188

224189
@acquire_spill_lock()
225190
def last_day_of_month(Column col):
226-
cdef unique_ptr[column] c_result
227-
cdef column_view col_view = col.view()
228-
229-
with nogil:
230-
c_result = move(libcudf_datetime.last_day_of_month(col_view))
231-
232-
return Column.from_unique_ptr(move(c_result))
191+
return Column.from_pylibcudf(
192+
plc.datetime.last_day_of_month(
193+
col.to_pylibcudf(mode="read")
194+
)
195+
)

0 commit comments

Comments
 (0)