虽然这是一个很常见的实用工具,可能很多人都需要它,但奇怪的是,Google并未向我显示任何匹配的答案。 我有一个时间戳,其格式为HH:MM:SS.NANOSECONDPRECISION
秒后9位数。我在R中有2个这样的列,我需要找出差异。我无法找到如何使用POSIX,我们可以将这些字符时间戳转换为可比较的数字。比较R中的纳秒精度时间戳
发送时间 - 11:20:30.791372292 接收时间11:20:30.791382216 什么是找到这两个时间戳之间差异的好方法
虽然这是一个很常见的实用工具,可能很多人都需要它,但奇怪的是,Google并未向我显示任何匹配的答案。 我有一个时间戳,其格式为HH:MM:SS.NANOSECONDPRECISION
秒后9位数。我在R中有2个这样的列,我需要找出差异。我无法找到如何使用POSIX,我们可以将这些字符时间戳转换为可比较的数字。比较R中的纳秒精度时间戳
发送时间 - 11:20:30.791372292 接收时间11:20:30.791382216 什么是找到这两个时间戳之间差异的好方法
只要它是安全的假设,你的时间始终在同一天,以下将起作用。它将每次重新计算为从一天开始以来发生的纳秒数。它假定使用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)
如果你会遇到出现在不同的日期时间,你可以采取类似的方法,但可能要考虑的上限天,可能是两个时间之间的数量。如果你有两天的时间,你将无法充分表示纳秒。
我会单独处理的亚秒:
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的S3类扩展慢性。
我将包发布到CRAN你可以currently get from GitHub,与此几乎涉及由@roland建议的方式 - 为S3扩展(约包bit64和RcppCCTZ
为了把你例如:
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偏移量。
我们发现两个时间戳之间的9924 nsec又称为9.924微秒。在我的行业,这听起来像是一个蜱贸易指标:)
已投下投票。请评论原因 – user1977867
我没有投票,但请分享一个可复制的时间戳的例子。由于浮点精度,你绝对不能使用'POSIXct',而且我对'POSIXlt'也有疑问。您可能需要通过从字符输入中提取这些数据来进行亚秒级比较。 – Roland
POSIXlt实际上使用_same representation_作为POSIXct:都精确到53位,因此大约有16位数。我们需要更多。自纪元可以做到这一点的基于整数64的纳秒表示。 –