Nea*_*sch 4 performance time r data.table
我有这样的数据:
library(data.table)
NN = 10000000
set.seed(32040)
DT <- data.table(
col = 1:10000000,
timestamp = 1521872652 + sample(7000001, NN, replace = TRUE)
)
Run Code Online (Sandbox Code Playgroud)
我试图将唯一的年份和周作为代码拉出来,这样我就可以对重复项进行排序(真正的数据表具有userID以及更多).我有一个当前的解决方案(下图),但是从日期列中唯一地粘贴数周和年份的部分很慢.日期的使用创建anytime包,拉week和year从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
Run Code Online (Sandbox Code Playgroud)
我的测试表明这是在paste扼杀我:
anytime到目前为止转换速度非常快
system.time(DT$localtime<- anytime(DT$timestamp, tz=tz)) ###Lightning fast
user system elapsed
0.264 0.417 0.933
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我使用format而不是使用代码运行速度提高约50%paste.
首先,我不确定anytime您的用例的重点,因为我们POSIXct几乎可以立即将时间戳放入结构中:
DT[ , localtime := .POSIXct(timestamp, tz = tz)]
Run Code Online (Sandbox Code Playgroud)
接下来,我搜索了基于?strptimeISO周的格式代码来获取:
DT[ , weekuni := format(localtime, format = '%G%V')]
Run Code Online (Sandbox Code Playgroud)
我不是100%确定它总是一样的paste(year, week),但是它适用于你的测试数据; 如果是它们之间的差别,你应该问,如果真正重要的你.
我能想到的唯一可能是更快的是在时间戳本身上使用整数算术.如果Africa/Addis_Ababa时区在您的采样时间范围内没有对其UTC偏移进行任何调整,这将非常容易(不幸的是,它看起来像是Africa/Addis_Ababa夏令时,因此UTC偏移在2到3小时之间变化,使整数算术方法更加明显难)
对于记录,使用data.table::year和data.table::week大约与此处使用的方法一样快,但它使用不同的"年"和"周"定义lubridate(默认情况下使用上面的ISO年/周%G%V).
data.table还没有isoyear实现,而且data.table::isoweek速度要慢得多lubridate::week.
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |