[英]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.