繁体   English   中英

时间间隔之间的Difftime()? (右)

[英]Difftime() Between Time Intervals? (R)

我想知道是否可以计算 R 中两个时间间隔之间的时间差。

对于单个日期,我知道我可以使用 difftime() 函数。

而且我知道我可以使用 lubridate 包中的 int_overlaps() 函数来了解两个间隔是否相互重叠(它提供 TRUE/FALSE 输出)。

现在,不是 TRUE/FALSE 输出,是否有一个函数可以给我两个间隔之间的时间差? 如果它们彼此重叠,则输出将为 0。否则,输出将是每个间隔的最近边界之间的时间差。

前任。:


int1 = 2020-03-10 11:00:00--2020-03-10 14:00:00

int2 = 2020-03-10 12:00:00--2020-03-10 13:00:00

int3 = 2020-03-10 08:00:00--2020-03-10 11:30:00

函数输出:

int1 and int2 -> 0

int1 and int3 -> 0

int2 and int3 -> 0.5 hours

您可以使用所需的输出编写自己的短函数。

首先,使用int_overlaps获取测试重叠的int_overlaps ,如果为TRUE ,则使用make_difftime(0)返回 0 秒。

如果没有重叠,您可以使用lubridate包中的int_startint_end来获取两个间隔的开始和结束,然后与difftime进行比较。

为了完整性,添加一些错误检查以确保两个输入都是单个间隔对象是明智的:

library(lubridate)

interval_difftime <- function(a, b)
{
  stopifnot(is.interval(a) & is.interval(b) & length(a) == 1 & length(b) == 1)

  if (int_overlaps(a, b)) return(make_difftime(0))
  if (int_end(a) < int_start(b)) return(-difftime(int_start(b), int_end(a)))
  else return(difftime(int_start(a), int_end(b)))
}

排序的工作方式与difftime相同,因为如果将较晚的间隔放在首位,则会得到正差异,但如果将较早的间隔放在首位,则会产生负差异。

假设我有以下区间xyz

n <- now()
x <- interval(n, n + 5)
y <- interval(n + 3, n + 8)
z <- interval(n + 6, n + 10)

然后下面的测试给出了期望的结果:如果间隔重叠,则时间差为零; 否则按顺序的间隔近端之间的差异:

interval_difftime(x, y)
#> Time difference of 0 secs
interval_difftime(x, z)
#> Time difference of -1 secs
interval_difftime(z, x)
#> Time difference of 1 secs

reprex 包(v0.3.0) 于 2020 年 3 月 16 日创建

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM