gpt4 book ai didi

r - 提高 R 中 data.table 中两列的粘贴速度(可重现)

转载 作者:行者123 更新时间:2023-12-04 23:13:02 25 4
gpt4 key购买 nike

我有这样的数据:

library(data.table)
NN = 10000000
set.seed(32040)
DT <- data.table(
col = 1:10000000,
timestamp = 1521872652 + sample(7000001, NN, replace = TRUE)
)

我试图将唯一的年份和星期作为代码提取,以便我可以对重复项进行排序(真实数据表具有 userID 以及更多)。我 有一个有效的当前解决方案(如下),但速度很慢 在从日期列唯一粘贴周和年的部分。使用 anytime 创建日期包拉 weekyear来自 lubridate还是很快的。有人可以帮我加快速度吗?谢谢!

我的慢代码(有效,但我想加快速度) :
library(anytime)
library(lubridate)
tz<-"Africa/Addis_Ababa"
DT$localtime<- anytime(DT$timestamp, tz=tz) ###Lightning fast
DT$weekuni <- paste(year(DT$localtime),week(DT$localtime),sep="") ###super slow

我的测试表明它是 paste那杀了我:

非常快 anytime转换至今:
system.time(DT$localtime<-  anytime(DT$timestamp, tz=tz)) ###Lightning fast
user system elapsed
0.264 0.417 0.933

快速 lubridate从日期转换周和年,但速度很慢 paste :
> system.time(DT$weekuni1 <- week(DT$localtime)) ###super slow
user system elapsed
1.203 0.188 1.400
> system.time(DT$weekuni2 <- year(DT$localtime))
user system elapsed
1.229 0.189 1.427
> system.time(DT$weekuni <- paste0(DT$weekuni1,dt$weekuni2))
user system elapsed
14.652 0.344 15.483

最佳答案

我使用 format 使您的代码运行速度提高了约 50%而不是 paste .

首先,我不确定 anytime 的意义对于您的用例,因为我们可以将时间戳放入 POSIXct结构几乎立即:

DT[ , localtime := .POSIXct(timestamp, tz = tz)]

接下来,我在 ?strptime 上四处搜索获取基于 ISO 周的格式代码:
DT[ , weekuni := format(localtime, format = '%G%V')]

我不是 100% 确定这将始终与 paste(year, week) 相同,但它是为您的测试数据;如果它们之间存在差异,您应该询问这对您来说是否真的很重要。

我唯一能想到的可能更快的是对时间戳本身使用整数算法。如果 Africa/Addis_Ababa,这会容易得多时区在您的示例时间范围内没有对其 UTC 偏移量进行任何调整(不幸的是,它看起来像 Africa/Addis_Ababa 遵守夏令时,因此 UTC 偏移量在 2 和 3 小时之间变化,使得整数算术方法变得更加困难)

作为记录,使用 data.table::yeardata.table::week与这里使用的方法一样快,但它使用的“年”和“周”定义与 lubridate 不同。 (默认情况下使用 %G%V 上面所做的 ISO 年/周)。
data.table还没有 isoyear实现,以及 data.table::isoweek明显慢于 lubridate::week .

关于r - 提高 R 中 data.table 中两列的粘贴速度(可重现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50998189/

25 4 0