【问题标题】:What is the most efficient way to calculate difftime of two time which are string format计算字符串格式的两次时间的最有效方法是什么
【发布时间】:2022-01-13 06:55:19
【问题描述】:

我有一个大数据集(作为一个数据表,超过 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

以第一行为例,我不能用difftime,strptime来计算"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 中有没有一种有效的方法来做到这一点?

【问题讨论】:

  • 你有什么理由不只是减去时间吗?时间差似乎在毫秒范围内,所以你的结果无论如何都是一个数字,而不是时间戳。
  • @D.J,感谢您的评论。在实际数据中,时差可能超过3小时,但所有时间都是同一天。例如。 time0="93005220"("09:30:05.220"),time1="150001330"("15:00:01.330")。我将其作为最后一行添加到 eg.data。
  • @D.J.我确实需要数字的结果,我会尝试测试减法,谢谢。
  • lubridate 通常更快,如果你知道它是 hms 格式,请尝试hms(col1) - hms(col2)。他们的实施可能会加快一点。
  • @Oliver hms 无法解析“93005220”格式。

标签: r time strptime difftime


【解决方案1】:

一种方法是考虑每个数字包含有关已过去多少秒的信息,但有些表示不同(即小时、分钟)。如果数字的所有单位都是秒,我们可以直接使用-进行比较。

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's 方法,f 将输入整数转换为其分量的向量(必要时用 0 填充)。这些分量然后通过乘法转换为秒,这是一种矢量化操作。也就是说,c(1,2) * c(3,4) 的计算结果为 c(3, 8)

【讨论】:

猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
相关资源
最近更新 更多