计算两个(或更多)时钟时间之间的绝对分钟数

时间:2016-05-14 07:19:29

标签: r time absolute-value

给出以下两个由格式为“%H:%M”的时间组成的字符向量:

Time1 <- c("23:00","23:59","00:01", "01:00")

Time2 <- c("00:00"," 00:00","00:00", "00:00") 

如何计算时间之间的绝对距离,使我的结果如下:

[1] 60  1  1 60 

值是否代表每对次数之间的分钟数?

我已阅读 psych 包的文档,并通过文档搜索 lubridate ,但尚未确定解决方案。

我试图为时间向量分配固定日期

fixedDATE <- "2012-05-19"
T1 <- as.POSIXct(paste(fixedDATE, Time1 ))
T2 <- as.POSIXct(paste(fixedDATE, Time1 ))
T1 - T2
Time differences in mins
[1] 1380 1439    1   60

我感谢任何帮助解决这个看似简单的困境。

2 个答案:

答案 0 :(得分:0)

正如我所看到的,这个问题有很多解决方案,效率或多或少都有。但考虑到你做了什么,你可以继续以下列方式:

x <- abs(T1-T2)
pmin(x, 24*60 - x)

一天有24 * 60分钟,所以24*60 - x我们有点向相反的方向移动。在一个方向和另一个方向上有时间差异,我们可以比较它们并选择pmin的最小值。

答案 1 :(得分:0)

以下是使用lubridate的方法:

library(lubridate);
x <- abs(period_to_seconds(hm(Time1)-hm(Time2)))/60;
ifelse(x>720,1440-x,x);
## [1] 60  1  1 60

此新示例的预期结果与您问题中给出的示例不一致。

由于24小时制的周期特性,在两个平原时间内,您可以在两个平均时间之间计算两个可能的正距离:(1)将时钟从时间1向前循环到时间2,或(2)将时钟从Time1向后循环到Time2。其中一个计算需要在概念上“包裹”端点周围的距离(00:00或24:00),而其他计算则不需要包装。哪个端点交叉,哪个计算交叉,取决于两次的绝对顺序。对于Time1&gt; Time2,正向计算将在24:00左右回转,而向后计算将不会回绕,而对于Time1&lt; Time2,正向计算将不会回绕而向后计算将回绕到00:00。

除了(1)相等次数和(2)12小时距离的特殊情况外,与正向计算相比,所有(Time1,Time2)对将产生不同的反向计算距离。

根据您在问题中提供的示例,您似乎想要从两种类型的计算中选择两个可能距离的较小距离。对于该示例,前向距离是60,1,1399,1380,而后向距离是1380,1439,1,60。因为你想要60,1,1,60,所以看起来你想要两个可能距离中较小的一个。

这就是为什么IaroslavDomin使用pmin()提供解决方案来获得更小的距离。我使用ifelse()来实现相同的逻辑。

对于Time1 = 18:00和Time2 = 07:00的新示例,前方距离为780(即13小时),后方距离为660(即11小时)。使用我和IaroslavDomin编写的相同代码,我们得到660的结果,这是我们所期望的,因为我们打算选择两个可能距离中较小的一个。

如果您有不同的要求,您应该提出一个新问题,说明不同的要求。但考虑到选择两个可能距离中较小的一个的解释,我的代码和IaroslavDomin的代码都是正确的。