比较R中的纳秒精度时间戳

时间:2016-12-07 12:19:32

标签: r timestamp

虽然这是许多人可能需要的相当常见的实用程序,但奇怪的是谷歌并没有向我显示任何匹配的答案。 我有一个时间戳,格式为HH:MM:SS.NANOSECONDPRECISION秒后的数字。我在R中有2个这样的列,我需要找到差异。我无法找到如何使用POSIX将这些字符时间戳转换为可比较的数字。

发送时间 - 11:20:30.791372292 收到时间11:20:30.791382216 找出这两个时间戳之间差异的好方法

3 个答案:

答案 0 :(得分:4)

我即将向CRAN发布一个软件包,您可以currently get from GitHub以@roland建议的方式处理这个问题 - 作为S3扩展(围绕软件包bit64和{{ 3}}

举个例子:

R> sentt <- nanotime("2016-12-21T11:20:30.791372292+00:00")
R> receivet <- nanotime("2016-12-21T11:20:30.791382216+00:00")
R> format(c(sentt, receivet))
[1] "1482319230791372292" "1482319230791382216"
R> format(sentt)
[1] "2016-12-21T11:20:30.791372292+00:00"
R> format(receivet)
[1] "2016-12-21T11:20:30.791382216+00:00"
R> receivet-sentt
integer64
[1] 9924
R> 

我(目前)使用固定格式进行解析,这很容易概括。我还需要添加一个日期(因为你永远不能只用时间解析日期时间,它是不确定的)并且对于解析字符串原因添加了一个0的TZ offet。

我们在两个时间戳之间找到了9924纳秒,即9.924微秒。在我的行业中,这听起来像是一种交易价格指标:)

答案 1 :(得分:2)

只要可以安全地假设您的时间总是在同一天,以下内容将起作用。它每次重新计算为从一天开始以来发生的纳秒数。假设使用24小时。

sent_time <- "11:20:30.791372292"
receive_time <- "11:20:30.791382216"

convert_nano <- function(x){
  require(magrittr)
  split <- 
    #* split up the time components
    strsplit(x, ":") %>%
    #* convert strings to numerics
    lapply(as.numeric) %>%
    #* convert each component to nanoseconds
    vapply(function(s) sum(s * c(3600, 60, 1) * 10 ^ 9),
           numeric(1))
}

convert_nano(receive_time) - convert_nano(sent_time)

如果您遇到不同日期发生的时间,您可能采取类似的方法,但可能需要考虑两次之间的天数上限。如果你有两天的时间,你将无法充分代表纳秒。

答案 2 :(得分:0)

我将分别处理亚秒:

times <- c("11:20:30.791372292", "11:20:30.791382216")

library(chron)

fulltimes <- round(as.numeric(times(times)) * 24 * 3600)
subtimes <- as.numeric(gsub(".+(?=\\.)", "0", times, perl = TRUE))

#difference
sprintf("%.9f", fulltimes[2] - fulltimes[1] + subtimes[2] - subtimes[1])
#[1] "0.000009924"

您可以使用此亚秒处理和适当的S3方法轻松创建一个扩展chron的S3类。