雖然這是一個很常見的實用工具,可能很多人都需要它,但奇怪的是,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的納秒錶示。 –