2016-12-07 11 views
-1

これは多くの人にとって必要とされる非常に一般的なユーティリティですが、不思議なことにGoogleには一致する答えが表示されません。 タイムスタンプは、HH:MM:SS.NANOSECONDPRECISION秒後に9桁で表示されます。私はRにこのような列が2つあります。違いを見つける必要があります。私は、POSIXをどのように使用して、そのような文字タイムスタンプを同等の数に変換できるかを見つけることができません。ナノ秒精度のタイムスタンプの比較R

送信された時間 - 11:20:20:30.791372292 時間11受け取るこれら2つのタイムスタンプの違いを見つけるための良い方法は何30.791382216 を限り、あなたの時間が常にあると仮定しても安全であるよう

+0

すでにダウンしました。理由をご記入ください – user1977867

+2

私は投票しませんでしたが、そのようなタイムスタンプの再現可能な例を共有してください。浮動小数点精度のためにあなたは間違いなく 'POSIXct'を使うことができません。私は' POSIXlt'についても疑問を抱いています。文字入力からこれらを抽出することで、おそらく秒以下の比較を行う必要があります。 – Roland

+0

POSIXltは実際に_same表現を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) 

あなたは別の日に発生した回に遭遇した場合は、同様のアプローチを取るかもしれないが、2倍の間であってもよいの日数に上限を検討する必要があります。 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の方法でクロンを拡張するS3クラスを作成することができます。

2

私は@rolandによって提案された方法でこのほとんどを扱うことができますcurrently get from GitHub CRANへのパッケージをリリースしようとしています - 。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オフセットが追加されました。

これで、2つのタイムスタンプの間に9924nsecの9.924マイクロ秒が見つかりました。私の業界では、tick-to-tradeメトリックのように聞こえます:)

関連する問題