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

Filtering dataset for a specific date with lubridate and dyplr

我正在尝试针对特定日期过滤我的 tibble。如果我尝试 >= 那个日期和 <= 那个相同的日期,代码会导致 0 行被 returned。我已经确定 <= 是 return 的 FALSE 我认为应该是 TRUE 的行。下面是一个工作示例。我只对 tidyverselubridate 相关的回复感兴趣 - 请不要 post 使用 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))

当我尝试以下操作时,它 return 是一个 tibble 有 0 行:

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

然而,当我尝试这个时,它起作用了。 我错过了什么? 问题是,我想 Date <= as_date("2019-11-03") 到 return TRUE所有“2019-11-03”提交(实际上我的数据集中有这些),但没有。

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

%in%的意思是判断一个特定的值是否包含在向量运算符中。所以你可以使用 %in% .

d %>%
  filter(Date >= as.Date("2019-11-02") %in%
           (Date <= as_date("2019-11-03")))
# A tibble: 7 x 2
  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

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

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

此外,我们还可以使用between

d %>%
  filter(between(as_date(Date), as_date("2019-11-02"), as_date("2019-11-02")))