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

Compute the absolute number of minutes between two (or more) clock times

给定以下两个由时间组成的字符向量,格式为“%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

对于解决这个看似简单的难题的任何帮助,我表示感谢。

据我所知,这个问题有很多解决方案,或多或少都有效率。但是考虑到你所做的,你可以继续以下方式:

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

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

以下是使用 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。其中一个计算在概念上需要 "wrapping" 端点周围的距离(00:00 或 24:00),而另一个计算不需要环绕。越过哪个端点,哪个计算越过它,取决于两次的绝对顺序。对于Time1>Time2,正向计算将环绕24:00而反向计算不会环绕,而对于Time1

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

根据您在问题中给出的示例,您似乎想要 select 更小 可以从两种类型的计算。对于该示例,前向距离为 60,1,1439,1380,而后向距离为 1380,1439,1,60。由于您想要 60,1,1,60 作为结果,因此看起来您确实想要两个可能距离中的较小者。

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

对于时间 1=18:00 和时间 2=07:00 的新示例,前进距离为 780(即 13 小时),而后退距离为 660(即 11 小时)。使用我和 IaroslavDomin 编写的相同代码,我们得到了 660 的结果,这正是我们所期望的,因为我们打算 select 计算两个可能距离中较小的一个。

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