我正在使用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