【问题标题】:Difftime() Between Time Intervals? (R)时间间隔之间的Difftime()? (右)
【发布时间】:2020-06-27 22:36:33
【问题描述】:

我想知道是否可以计算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

【问题讨论】:

    标签: r time intervals lubridate


    【解决方案1】:

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

    首先,使用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 package (v0.3.0) 于 2020-03-16 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-21
      • 2017-09-10
      • 2013-10-08
      • 1970-01-01
      • 2013-06-07
      • 2014-07-12
      • 1970-01-01
      • 2019-03-23
      相关资源
      最近更新 更多