如何使用data.table对fast_strptime进行矢量化以实现快速的日期时间

时间:2019-07-02 12:38:13

标签: r data.table lubridate

我正在使用data.table,因为每个csv文件要处理超过500万个观察值,但是我在将日期的字符向量转换为日期时间对象时遇到了一些麻烦,因此我无法汇总数据。

请注意,我的数据格式为“ 20120127154843”,但是在我提供的示例数据集中,格式为“ 2012-01-27 15:48:43”(这可能会影响是否可以使用fastPOSIXct())。

我尝试按照以下建议将fast_strptime创建的lt格式对象转换为矢量格式:https://stackoverflow.com/a/24148520/7778675,但是它似乎并不能显着加快速度,并且最大的时间成本是转换。

令人惊讶的是,功能ymd_hms()运作良好(但不如fast_strptime()快)。

非常欢迎您提出如何结合fast_strptime()data.table()的建议!

# Load packages
library(data.table)
library(lubridate)
library(fasttime)

# Set up data
dt <- as.data.table(rep(as.character(Sys.time()+runif(1,-1e9,1e9)),5e6))

# Determine time stamp
# as.POSIXct
system.time(dt[ , starttime := as.POSIXct(V1, format = "%Y-%m-%d %H:%M:%S", tz = "Europe/Amsterdam")])
# fast_strptime and as.POSIXct
system.time(dt[ , starttime := as.POSIXct(fast_strptime(V1, format = "%Y-%m-%d %H:%M:%S", tz = "Europe/Amsterdam"))])
# fast_strptime
system.time(starttime <-  fast_strptime(dt[, V1], format = "%Y-%m-%d %H:%M:%S", tz = "Europe/Amsterdam"))
# fast_strptime convert lt to ct format
system.time(starttime <-  fast_strptime(dt[, V1], format = "%Y-%m-%d %H:%M:%S", tz = "Europe/Amsterdam", lt = F))
# parse_date_time2
system.time(dt[ , starttime := parse_date_time2(V1, orders = "YmdHMS", tz = "Europe/Amsterdam")])
# ymd_hms
system.time(dt[ , starttime := ymd_hms(V1, tz = "Europe/Amsterdam")])

结果如下:

> # Determine time stamp
> # as.POSIXct
> system.time(dt[ , starttime := as.POSIXct(V1, format = "%Y-%m-%d %H:%M:%S", tz = "Europe/Amsterdam")])
   user  system elapsed 
  49.65    0.06   49.75 
> # fast_strptime and as.POSIXct
> system.time(dt[ , starttime := as.POSIXct(fast_strptime(V1, format = "%Y-%m-%d %H:%M:%S", tz = "Europe/Amsterdam"))])
   user  system elapsed 
  25.06    0.05   25.16 
> # fast_strptime
> system.time(starttime <-  fast_strptime(dt[, V1], format = "%Y-%m-%d %H:%M:%S", tz = "Europe/Amsterdam"))
   user  system elapsed 
   0.33    0.06    0.39 
> # fast_strptime convert lt to ct format
> system.time(starttime <-  fast_strptime(dt[, V1], format = "%Y-%m-%d %H:%M:%S", tz = "Europe/Amsterdam", lt = F))
   user  system elapsed 
  24.48    0.05   24.56 
> # parse_date_time2
> system.time(dt[ , starttime := parse_date_time2(V1, orders = "YmdHMS", tz = "Europe/Amsterdam")])
   user  system elapsed 
  24.55    0.06   24.62 
> # ymd_hms
> system.time(dt[ , starttime := ymd_hms(V1, tz = "Europe/Amsterdam")])
   user  system elapsed 
   1.36    0.12    1.53 

0 个答案:

没有答案