2016-12-07 74 views
-1

虽然这是一个很常见的实用工具,可能很多人都需要它,但奇怪的是,Google并未向我显示任何匹配的答案。 我有一个时间戳,其格式为HH:MM:SS.NANOSECONDPRECISION秒后9位数。我在R中有2个这样的列,我需要找出差异。我无法找到如何使用POSIX,我们可以将这些字符时间戳转换为可比较的数字。比较R中的纳秒精度时间戳

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

+0

已投下投票。请评论原因 – user1977867

+2

我没有投票,但请分享一个可复制的时间戳的例子。由于浮点精度,你绝对不能使用'POSIXct',而且我对'POSIXlt'也有疑问。您可能需要通过从字符输入中提取这些数据来进行亚秒级比较。 – Roland

+0

POSIXlt实际上使用_same representation_作为POSIXct:都精确到53位,因此大约有16位数。我们需要更多。自纪元可以做到这一点的基于整数64的纳秒表示。 –

回答

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) 

如果你会遇到出现在不同的日期时间,你可以采取类似的方法,但可能要考虑的上限天,可能是两个时间之间的数量。如果你有两天的时间,你将无法充分表示纳秒。

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的S3类扩展慢性。

2

我将包发布到CRAN你可以currently get from GitHub,与此几乎涉及由@roland建议的方式 - 为S3扩展(约包bit64RcppCCTZ

为了把你例如:

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微秒。在我的行业,这听起来像是一个蜱贸易指标:)