0

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

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

4

2 回答 2

0

正如我所见,这个问题有很多解决方案,或多或少是有效的。但是考虑到您所做的事情,您可以通过以下方式继续:

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

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

于 2016-05-14T07:46:56.823 回答
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) 将时钟从 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 的代码都是正确的。

于 2016-05-14T12:56:08.517 回答