r-有时lubridate中的%within%函数没有返回预期的结果-我做错了什么



我有一个与包含日期时间数据的项目相关的数据框架/tibble。有两个日期时间列,一个用于项目开始时间Launch Date,另一个用于该项目结束时间End Date

无论出于何种原因,当我过滤End Date列而不是Launch Date列时,%within%函数会按预期运行,我不知道为什么。

到目前为止,我会一步一步带你完成我的调查。所有这些都是直接从代码/控制台复制的,所以如果有拼写错误或错误,指出它们是合法的。(然而,对于这个讨论,风格的改变是没有帮助的。(此外,因为我们处理的是日期,下面的所有示例代码都假设引用日期为";今天";是我发布这篇文章的日子,2021年3月12日。

首先,我创建了我想要的间隔(项目在一周内结束,从明天开始;上周开始的项目不包括今天(:

endInterval <- interval(today() + days(1), today() + weeks(1))
newInterval <- interval(today() - weeks(1), today() - days(1))

接下来我测试间隔是否包含预期的日期范围:

> int_end(endInterval)
[1] "2021-03-19 UTC"
> int_start(endInterval)
[1] "2021-03-13 UTC"
> int_end(newInterval)
[1] "2021-03-11 UTC"
> int_start(newInterval)
[1] "2021-03-05 UTC"

%within%函数按预期的间隔工作:

> int_end(endInterval) %within% endInterval
[1] TRUE
> int_start(endInterval) %within% endInterval
[1] TRUE
> int_end(newInterval) %within% newInterval
[1] TRUE
> int_start(newInterval) %within% newInterval
[1] TRUE

到目前为止,是如此的重复。现在,我将使用这些间隔和%within%函数来过滤主数据帧/tibble(简称为data(。首先,我将使用我设置的endInterval进行筛选,并通过将结果保存到新的数据框中,然后查看End Date列中的唯一日期来显示它是否按预期工作:

> endData <- data %>% filter(`End Date` %within% endInterval) %>% arrange(`End Date`)
> unique(endData$`End Date`)
[1] "2021-03-13 03:00:00 UTC" "2021-03-13 03:24:00 UTC" "2021-03-13 07:00:00 UTC" "2021-03-13 12:00:00 UTC" "2021-03-13 15:34:00 UTC" "2021-03-14 16:39:00 UTC"
[7] "2021-03-15 09:50:00 UTC" "2021-03-15 13:02:00 UTC" "2021-03-15 14:01:00 UTC" "2021-03-15 17:11:00 UTC" "2021-03-15 18:00:00 UTC" "2021-03-15 20:00:00 UTC"
[13] "2021-03-16 00:00:00 UTC" "2021-03-16 12:46:00 UTC" "2021-03-16 13:59:00 UTC" "2021-03-16 14:59:00 UTC" "2021-03-16 17:30:00 UTC" "2021-03-16 18:45:00 UTC"
[19] "2021-03-16 19:00:00 UTC" "2021-03-16 20:00:00 UTC" "2021-03-16 22:59:00 UTC" "2021-03-17 02:00:00 UTC" "2021-03-17 03:00:00 UTC" "2021-03-17 06:35:00 UTC"
[25] "2021-03-17 06:59:00 UTC" "2021-03-17 10:56:00 UTC" "2021-03-17 14:58:00 UTC" "2021-03-17 16:00:00 UTC" "2021-03-17 23:00:00 UTC" "2021-03-18 00:00:00 UTC"
[31] "2021-03-18 03:59:00 UTC" "2021-03-18 14:53:00 UTC" "2021-03-18 17:12:00 UTC" "2021-03-18 20:06:00 UTC" "2021-03-19 00:00:00 UTC"

这表明,正如预期的那样,返回的数据确实包括包含间隔端点的数据。

当我使用newIntervalLaunch Date列做完全相同的事情时,问题就来了。

> newData <- data %>% filter(`Launch Date` %within% newInterval) %>% arrange(`Launch Date`)
> unique(newData$`Launch Date`)
[1] "2021-03-05 15:00:00 UTC" "2021-03-05 15:04:00 UTC" "2021-03-05 18:11:00 UTC" "2021-03-05 22:07:00 UTC" "2021-03-06 15:00:00 UTC" "2021-03-06 17:03:00 UTC"
[7] "2021-03-08 06:20:00 UTC" "2021-03-08 08:07:00 UTC" "2021-03-08 11:16:00 UTC" "2021-03-08 12:00:00 UTC" "2021-03-08 14:03:00 UTC" "2021-03-08 16:11:00 UTC"
[13] "2021-03-08 16:59:00 UTC" "2021-03-08 17:59:00 UTC" "2021-03-08 18:03:00 UTC" "2021-03-08 18:12:00 UTC" "2021-03-08 19:37:00 UTC" "2021-03-09 05:01:00 UTC"
[19] "2021-03-09 08:00:00 UTC" "2021-03-09 08:38:00 UTC" "2021-03-09 10:42:00 UTC" "2021-03-09 12:12:00 UTC" "2021-03-09 13:00:00 UTC" "2021-03-09 14:00:00 UTC"
[25] "2021-03-09 14:37:00 UTC" "2021-03-09 16:00:00 UTC" "2021-03-09 16:11:00 UTC" "2021-03-09 16:30:00 UTC" "2021-03-09 16:59:00 UTC" "2021-03-09 17:03:00 UTC"
[31] "2021-03-09 17:07:00 UTC" "2021-03-09 17:59:00 UTC" "2021-03-09 18:00:00 UTC" "2021-03-09 19:17:00 UTC" "2021-03-09 19:52:00 UTC" "2021-03-09 20:03:00 UTC"
[37] "2021-03-10 01:34:00 UTC" "2021-03-10 02:40:00 UTC" "2021-03-10 02:45:00 UTC" "2021-03-10 13:25:00 UTC" "2021-03-10 14:43:00 UTC" "2021-03-10 15:56:00 UTC"
[43] "2021-03-10 16:48:00 UTC"

返回的数据包括日期时间,这些时间包括间隔的开始,但不包括结束。是的,有数据显示2021年3月11日的Launch Dates。(为了防止太长,将其截断。(

> unique(data$`Launch Date`)
[1] "2021-03-01 18:42:00 UTC" "2021-02-06 00:27:00 UTC" "2021-02-16 15:53:00 UTC" "2021-03-01 16:59:00 UTC" "2021-03-06 17:03:00 UTC"
[6] "2021-02-06 01:43:00 UTC" "2021-03-01 05:01:00 UTC" "2021-03-02 17:59:00 UTC" "2021-02-01 07:18:00 UTC" "2021-02-12 17:39:00 UTC"
....
[171] "2021-03-11 16:04:00 UTC" "2021-03-11 17:56:00 UTC" "2021-03-11 21:08:00 UTC" "2021-03-11 02:46:00 UTC" "2021-03-11 14:00:00 UTC"
[176] "2021-03-11 16:00:00 UTC" "2021-03-11 17:42:00 UTC" "2021-03-11 16:36:00 UTC" "2021-03-11 18:53:00 UTC" "2021-03-11 04:29:00 UTC"

这些人的行为应该是一样的,但他们没有,我不知道为什么。希望你们中的一个能做到。

这只是因为这些日期时间不在newInterval中。newInterval中的最后一个时间是2021-03-11 00:00:00 UTC。也就是说,您的LaunchDate中没有2021-03-11 00:00:00 UTC的确切时间,这会让您怀疑当天的任何时间都应该存在,但请注意,endInterval结束日期上的唯一时间戳是00:00:00。

as_datetime("2021-03-10 23:59:59 UTC") %within% newInterval
TRUE
as_datetime("2021-03-11 00:00:00 UTC") %within% newInterval
TRUE
as_datetime("2021-03-11 00:00:01 UTC") %within% newInterval
FALSE
as_datetime("2021-03-11 16:04:00 UTC") %within% newInterval
FALSE

您可以将newInterval调整到一天结束时。

newInterval=interval(as_datetime("2021-03-05 UTC 00:00:00"), as_datetime("2021-03-11 23:59:59 UTC"))
as_datetime("2021-03-11 00:00:01 UTC") %within% newInterval
TRUE
as_datetime("2021-03-11 16:04:00 UTC") %within% newInterval
TRUE

相关内容

最新更新