Strptime data.table中的R毫秒数

时间:2015-07-29 10:16:54

标签: r data.table

我正在尝试将日期和时间转换为R中的带有data.table的毫秒时间戳(我有~300M行,因此速度确实很重要!所以如果你有比strptime更快的选项(例如矢量化)函数我不需要data.table中的'by'参数),我会很高兴!:))。

到目前为止的问题如下:

library(data.table)
options(digits.secs = 3)
a <- data.table(day = "20150727", time = "11:10:05.016")

a[, mtime := strptime(paste(day, time), "%Y%m%d %H:%M:%OS", tz = "GMT"),
  by = 1:nrow(a)]
a
#> a
#   day       time        mtime
#1: 20150727 11:10:05.016 5.016 

问题是mtime绝对不对......我想得到整个时间戳而不仅仅是秒。 当我手工完成时它工作正常:

strptime(paste("20150727", "11:10:05.016"), "%Y%m%d %H:%M:%OS", tz = "GMT")
# [1] "2015-07-27 11:10:05.016 GMT"

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:4)

我遇到了你所描述的同样问题。但是,当我使用as.POSIXct时,没有问题。你可以尝试自己看看它是否有效吗?

我尝试了以下内容:

a[, posixct:=as.POSIXct(paste(day, time),format="%Y%m%d %H:%M:%OS", tz = "GMT")]

    day         time mtime                 posixct
 1: 20150727 11:10:05.016 5.016 2015-07-27 11:10:05.016

<强>更新

根据戴维斯的评论,我花了一些时间研究fasttime包。实际上它比as.POSIXct快得多,但是它有一个小的要求,即日期格式必须是标准的YYYY-MM-DD。下面是重新创建表格和一些时间比较的代码。

# assuming that day is 2015-07-27
a[, fastposixct:=fastPOSIXct(paste(day, time),required.components = 6L, tz = "GMT")]
Unit: microseconds
expr          min    lq     mean median      uq     max neval
as.POSIXct 61.579 62.64 69.59851 63.349 65.4725 240.298   100

Unit: microseconds
expr           min     lq     mean median      uq     max neval
fastPOSIXct 26.897 27.959 33.96092 28.666 30.6135 135.544   100

希望这有帮助。