2017-09-04 101 views
2

运行一些测试以了解如何使用lubridate库类interval来解决问题。lubridate日期 - 时间间隔行为 - 在时间间隔内找到单个日期

有没有简单的方法来检查一个日期/时间是否在给定的时间间隔内?到目前为止,我所提出的所有方法都是将单一日期转换为将单个日期重复为开始和结束时间的间隔,然后像这样测试它。只是不知道是否有一个更好的办法:

library(lubridate) 
intTest <- mdy_hms("5/20/2017 2:28:57", 
    tz = "America/New_York") %--% mdy_hms("5/20/2017 2:28:59", 
    tz = "America/New_York") 

int_overlaps(interval(mdy_hms("5/20/2017 2:28:58", 
tz = "America/New_York"), mdy_hms("5/20/2017 2:28:58")), intTest) 

使用%within%也试过,但没有为这种情况无论是工作(除非我用错了不知)。试图这里给出的测试例子,但即使答案是TRUE返回FALSE

interval(mdy_hms("5/20/2017 2:28:58"), mdy_hms("5/20/2017 2:28:58")) 
     %within% intTest 

回答

1

我觉得这只是

mdy_hms("5/20/2017 2:28:58", tz = "America/New_York") %within% intTest 
#[1] TRUE 

这是?"%within%"帮助页面上的讨论,显示出a %within% b其中

“a:间隔或日期时间对象

确保您在比较时也匹配您的时区。

intTest 
#[1] 2017-05-20 02:28:57 EDT--2017-05-20 02:28:59 EDT 

myint <- interval(
    mdy_hms("5/20/2017 2:28:58", tz="America/New_York"), 
    mdy_hms("5/20/2017 2:28:58", tz="America/New_York") 
) 

myint 
#[1] 2017-05-20 02:28:58 EDT--2017-05-20 02:28:58 EDT 

myint %within% intTest 
#[1] TRUE 

myintUTC <- interval(
    mdy_hms("5/20/2017 2:28:58"), 
    mdy_hms("5/20/2017 2:28:58") 
) 

myintUTC 
#[1] 2017-05-20 02:28:58 UTC--2017-05-20 02:28:58 UTC 

myintUTC %within% intTest 
#[1] FALSE 
+0

我的问题的原因只是它需要格式字符串时,将日期提供到'%%%'内。 RStudio的帮助实际上表示“a是间隔,b是间隔”,所以现在我会知道帮助页面可能更新,然后在我的R环境中。 – TMWP

+0

感谢您的回答。有一个奇怪的难以复制的问题,即使用这种技术创建数据框的列,如果我总结得到它们的max()和min()值,然后尝试从df的另一列中的max中减去min ,结果显示的是正确的数字,但它表示分钟的时间应该是秒。在df列(使用mdy_hms()创建的)上执行操作时,是否需要格式化此方法?我找不到一个不仅仅表明我应该能够采用max(),min()并减去它们的例子:max(date_col) - min(date_col)'。 – TMWP

+0

@TMWP - 可能是'difftime(max(x),min(x),units =“secs”)' - 你可以指定'difftime'操作所需的单位 – thelatemail