簡體   English   中英

計算字符串格式的兩次時間的最有效方法是什么

[英]What is the most efficient way to calculate difftime of two time which are string format

我有一個大型數據集(作為 data.table,超過 1 億行)並希望計算兩列之間的 difftime。如果是“%H%M%OS”,則為時間字符串格式,沒有前導零。例如,數據

ID  time0      time1
 1  93005220  93005320
 2  93551060  93553940
 3  93717740  93717740
 4  94840800  94840800
 5  94959510  94959510
 6 101030460 101127870
 7 101425010 101425010
 8 104728320 104728980
 9 105704050 105705890
10 135109830 135402830
11 93005220 150001330

以第一行為例,我不能使用difftimestrptime來計算 "93005320"("09:30:05.320") 和 "93005220"("09:30:05.220") 之間的 difftime,我必須更改 " 93005220”轉換為“093005.220”這樣的格式,然后我嘗試如下:

difftime(strptime("093005.220","%H%M%OS"),strptime("093005.320","%H%M%OS"))

但是如果這樣做,對於超過 1 億行來說太慢了。 在 R 中是否有有效的方法來執行此操作?

一種方法是考慮每個數字包含關於已過去多少秒的信息,但有些表示不同(即小時、分鍾)。 如果數字的所有單位都是秒,我們可以使用-直接比較它們。

f = function(x){
  c(36000, 3600, 600, 60, 10, 1, .1, .01, .001) *
    x %% c(1e9, 1e8, 1e7, 1e6, 1e5, 1e4, 1e3, 1e2, 1e1) %/%
    c(1e8, 1e7, 1e6, 1e5, 1e4, 1e3, 1e2, 1e1, 1e0)
}
ff = Vectorize(function(x, y) sum(f(x) - f(y)))

然后以秒為單位獲得差異,這里使用dplyr

df %>%
    mutate(diff = ff(time1, time0))
       time0     time1     diff
       <dbl>     <dbl>    <dbl>
 1  93005220  93005320     0.1 
 2  93551060  93553940     2.88
 3  93717740  93717740     0   
 4  94840800  94840800     0   
 5  94959510  94959510     0   
 6 101030460 101127870    57.4 
 7 101425010 101425010     0   
 8 104728320 104728980     0.66
 9 105704050 105705890     1.84
10 135109830 135402830   173   
11  93005220 150001330 19796.

解釋:使用Anirban 的方法, f將輸入 integer 轉換為其組件的向量(必要時使用 0 填充)。 這些分量然后通過乘法轉換為秒,這是一種矢量化操作。 也就是說, c(1,2) * c(3,4)的計算結果為c(3, 8)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM