计算字符串格式的两个时间的差异时间的最有效方法是什么
What is the most efficient way to calculate difftime of two time which are string format
我有一个很大的数据集(data.table,超过 1 亿行)并且希望计算两个 column.and 时间字符串格式之间的差异时间 if "%H%M% OS",不带前导zeros.eg,data
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"),我必须将“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's 方法,f
将输入整数转换为其分量的向量(必要时用0 填充)。然后通过向量化运算乘法将这些分量转换为秒。也就是说,c(1,2) * c(3,4)
的计算结果为 c(3, 8)
。
我有一个很大的数据集(data.table,超过 1 亿行)并且希望计算两个 column.and 时间字符串格式之间的差异时间 if "%H%M% OS",不带前导zeros.eg,data
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"),我必须将“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's 方法,f
将输入整数转换为其分量的向量(必要时用0 填充)。然后通过向量化运算乘法将这些分量转换为秒。也就是说,c(1,2) * c(3,4)
的计算结果为 c(3, 8)
。