虽然这是许多人可能需要的相当常见的实用程序,但奇怪的是谷歌并没有向我显示任何匹配的答案。
我有一个时间戳,格式为HH:MM:SS.NANOSECONDPRECISION
秒后的数字。我在R中有2个这样的列,我需要找到差异。我无法找到如何使用POSIX将这些字符时间戳转换为可比较的数字。
发送时间 - 11:20:30.791372292 收到时间11:20:30.791382216 找出这两个时间戳之间差异的好方法
答案 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类。