以下是使用 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) 将时钟从 Time1 向前循环到 Time2,或 (2) 循环时钟从 Time1 倒退到 Time2。其中一个计算需要概念上“环绕”端点周围的距离(00:00 或 24:00),而另一个计算不需要环绕。哪个端点被交叉,哪个计算通过它,取决于两次的绝对顺序。对于 Time1>Time2,前向计算将在 24:00 左右回绕,而后向计算将不回旋,而对于 Time1<Time2,前向计算将在 00:00 左右回旋。
除了 (1) 相等时间和 (2) 12 小时距离的特殊情况外,所有 (Time1,Time2) 对将产生与前向计算不同的后向计算距离。
根据您在问题中给出的示例,您似乎想选择可以从两种类型的计算中获得的两种可能距离中的较小距离。例如,前向距离是 60,1,1439,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 的代码都是正确的。