簡體   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