[英]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_start
和int_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
相同,因为如果将较晚的间隔放在首位,则会得到正差异,但如果将较早的间隔放在首位,则会产生负差异。
假设我有以下区间x
, y
和z
:
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.