将从不同(相对)起点经过的时间转换为从零开始经过的时间

时间:2017-01-17 21:00:54

标签: r

我有一个表示秒(1:60)的向量:

x <- c(3, 8, 12, 18, 25, 58, 4, 25, 44, 59, 8)

3580 开始的秒数。第二组秒459表示从58秒过去的秒数,即最后一次在上一个块中注册的时间。例如。 4表示从4开始经过58秒,对25-59也是如此。最后8表示从59 过去的秒。

我希望从各个参考点以秒为单位转换这些时间,因此它们都代表从0开始经过的绝对秒数:

y <- c(3, 8, 12, 18, 25, 58, 62, 83, 102, 117, 125)

我们总结第6和第7个元素(58 + 4),第10个和第11个元素(59 + 8),甚至更多(每个接近60或甚至60)元素,并得到两个元素的每个差异。例如,4和25之间的差异是21. 21应该加到62并且y为83.

也许有POSIX或CHRON的解决方案,但我找不到解决这个问题的功能。

1 个答案:

答案 0 :(得分:1)

这是另一种选择。稍微复杂一点,但似乎给出了理想的结果。

library(data.table)
d <- data.table(x)

创建分组变量&#39; m&#39;,相应的分钟,好像每个秒组从点分标记开始:

d[ , m := c(0, cumsum(diff(x) < 1))]

计算一个新的秒变量,再次,好像每个秒组从点分钟开始。例如,第二轮秒中的4暂时对应于1分钟, 4 秒,64秒。

d[ , x2 := x + 60 * m]

然而,每个&#34;分钟内的秒数&#34>不是相对于组内分钟,而是相对于前一分钟的最后一次注册的秒数。因此,我们需要计算每分钟内最后一次注册的剩余秒数:

d2 <- d[ , .(dif = x[.N] - 60), by = m]

要将调整与正确的分钟对齐,请将它们向前移动。将第一分钟的调整设置为0。计算每分钟内要调整的累计秒数:

d2[ , adj := cumsum(shift(dif, fill = 0))]

加入原始数据和调整数据,使用by = .EACHI

一次性进行实际调整
d[d2, .(s = x2 + adj), on = "m", by = .EACHI]    
#     m   s
# 1:  0   3
# 2:  0   8
# 3:  0  12
# 4:  0  18
# 5:  0  25
# 6:  0  58
# 7:  1  62
# 8:  1  83
# 9:  1 102
# 10: 1 117
# 11: 2 125

我确信这可以简化。