使用 lubridate 和 dplyr 过滤特定日期的数据集

Bri*_*iro 2 r lubridate dplyr

我正在尝试筛选tibble特定日期。如果我尝试>=该日期和<=同一日期,代码将导致返回 0 行。我已经确定它是<=返回FALSE我认为应该返回的行TRUE。下面是一个工作示例。我只对相关回复感兴趣tidyverse-lubridate请不要使用 Base R 或其他软件包发布答案(我知道如何以这些其他方式解决问题。

数据

library(dplyr)
library(lubridate)

d <- structure(list(Date = structure(c(1572679159, 1572703322, 1572710363, 1572722578,
                                       1572727765, 1572728767, 1572730032),
                                     class = c("POSIXct", "POSIXt"),
                                     tzone = "UTC", label = c(EndDate = "EndDate")),
                    ID = 1:7), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"),
               row.names = c(NA, -7L))
Run Code Online (Sandbox Code Playgroud)

当我尝试以下操作时,它返回tibble0 行:

d %>%
  filter(Date >= as_date("2019-11-02"),
         Date <= as_date("2019-11-02"))
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试这样做时,它有效。我缺少什么?问题是,我想Date <= as_date("2019-11-03")返回TRUE所有“2019-11-03”提交的内容(我的数据集中实际上有这些内容),但事实并非如此。

d %>%
  filter(Date >= as_date("2019-11-02"),
         Date <= as_date("2019-11-03"))
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 6

您需要将日期时间对象转换为日期类,然后进行比较。也可用于&包含多个条件进行检查。

library(dplyr)
library(lubridate)

d %>%
  filter(as_date(Date) >= as_date("2019-11-02") & 
         as_date(Date) <= as_date("2019-11-02"))

#  Date                   ID
#  <dttm>              <int>
#1 2019-11-02 07:19:19     1
#2 2019-11-02 14:02:02     2
#3 2019-11-02 15:59:23     3
#4 2019-11-02 19:22:58     4
#5 2019-11-02 20:49:25     5
#6 2019-11-02 21:06:07     6
#7 2019-11-02 21:27:12     7
Run Code Online (Sandbox Code Playgroud)

此外,我们还可以使用between

d %>%
  filter(between(as_date(Date), as_date("2019-11-02"), as_date("2019-11-02")))
Run Code Online (Sandbox Code Playgroud)