2016-12-07 86 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微秒。在我的行業,這聽起來像是一個蜱貿易指標:)