numba - cuDF - groupby UDF 支持日期时间
问题描述
我有一个包含以下列的 cuDF 数据框:
columns = ["col1", "col2", "dt"]
( dt
) 的形式datetime64[ns]
。
我想编写一个 UDF 以应用于此数据框中的每个组,并dt
为每个组获取最大值。这是我正在尝试的,但似乎numba
不支持datetime64[ns]
UDF 中的值。
def f1(dt, out):
l = len(dt)
maxvalue = dt[0]
for i in range(cuda.threadIdx.x, l, cuda.blockDim.x):
if dt[i] > maxvalue:
maxvalue = dt[i]
out[:0] = maxvalue
gdf = df.groupby(["col1", "col2"], method="cudf")
df = gdf.apply_grouped(f1, incols={"dt": "dt"}, outcols=dict(out=numpy.datetime64))
这是我得到的错误:
This error is usually caused by passing an argument of a type that is unsupported by the named function.
[1] During: resolving callee type: Function(<numba.cuda.compiler.DeviceFunctionTemplate object at 0x7effda063510>)
[2] During: typing of call at <string> (10)
我有类似的函数,可以很好地处理整数和浮点数。这是否意味着 numba 不支持日期时间?
解决方案
Apply_groups
不会给你我认为你追求的东西,即 max 上的 groupby dt
。您需要使用aggs
with max on dt
。cudf 的 groupby 函数将完成其余的工作。要获取您的值datetime64[ms]
,请使用astype()
,并将其保存回数据框(非常快)。看我的例子:
import cudf
a = cudf.DataFrame({"col1": [1, 1, 1, 2, 2, 2], "col2": [1, 2, 1, 1, 2, 1], "dt": [10000000, 2000000, 3000000, 100000, 2000000, 40000000]})
a['dt'] = a['dt'].astype('datetime64[ns]')
print(a)
a['dt'] = a['dt'].astype('datetime64[ms]')
print(a)
gdf = a.groupby(["col1", "col2"]).agg({'dt':'max'})
print(gdf.head())
dt
从 1970 年 1 月 1 日起,列值将被格式化为 0.1-40 毫秒(以纳秒计),为您提供打印输出
col1 col2 dt
0 1 1 1970-01-01 00:00:00.010000
1 1 2 1970-01-01 00:00:00.002000
2 1 1 1970-01-01 00:00:00.003000
3 2 1 1970-01-01 00:00:00.000100
4 2 2 1970-01-01 00:00:00.002000
5 2 1 1970-01-01 00:00:00.040000
col1 col2 dt
0 1 1 1970-01-01 00:00:00.010
1 1 2 1970-01-01 00:00:00.002
2 1 1 1970-01-01 00:00:00.003
3 2 1 1970-01-01 00:00:00.000
4 2 2 1970-01-01 00:00:00.002
5 2 1 1970-01-01 00:00:00.040
dt
col1 col2
1 1 1970-01-01 00:00:00.010
2 1970-01-01 00:00:00.002
2 1 1970-01-01 00:00:00.040
2 1970-01-01 00:00:00.002
推荐阅读
- android - 即使 AppObject 不为 null,appPackageName 也会返回 null
- c++ - 无法在 Mac OS 上的 vscode 中进行 cin 或 cout
- linux - 将两个大于 10 的数字相加
- cmake - 尝试安装 gr-osmosdr 时出现 CMake 错误
- ios - 如何在不调用 tableView.reloadData() 的情况下更新表格视图单元格的 textView 标签
- java - 使用 Java (gson) 从 Json 读取对象
- javascript - 如何使用 javascript 操作 css?
- c++ - 在输入字母之前,我们如何才能进行数字输入?
- google-api - 如何发送英文文本并获得德语音频文件返回?
- android - 如何修复异常:未处理的异常:在收到完整标头之前连接已关闭