筛选R中的多个日期列

筛选R中的多个日期列,r,data.table,R,Data.table,我有一个3列的数据框。() 前两列(“Time1”、“Time2”)包含日期时间数据,并且都具有posixct格式:%Y-%m-%d%H:%m:%S” 因此,我最终需要的是行的子选择,其中对于Time1中的特定时间,只有行在Time2中被选择 是时间1的前一天(这里一天并不总是24小时;一天是指前一个日历日,基本上是“昨天”) 和时间2是凌晨12:00 一个正确的例子: +---------------------+----------------------+ | Time1

我有一个3列的数据框。()

前两列(“Time1”、“Time2”)包含日期时间数据,并且都具有posixct格式:
%Y-%m-%d%H:%m:%S”

因此,我最终需要的是行的子选择,其中对于Time1中的特定时间,只有行在Time2中被选择

  • 是时间1的前一天(这里一天并不总是24小时;一天是指前一个日历日,基本上是“昨天”)
  • 时间2是凌晨12:00
一个正确的例子:

+---------------------+----------------------+
|        Time1        |        Time2         |
+---------------------+----------------------+
| 2016-11-01 00:00:00 | 2016-10-31 00:00:00  |
+---------------------+----------------------+
一个错误的例子:

+---------------------+----------------------+
|        Time1        |        Time2         |
+---------------------+----------------------+
| 2016-11-01 00:00:00 | 2016-10-31 12:00:00  |
+---------------------+----------------------+
在上传的文件中,我手动添加了第三列(“值”),作为我希望在最后过滤的行的指导。带“True”的行对我来说很有趣


我用两个for循环解决了这个问题,但是在大型表中运行速度非常慢

使用
子集
润滑油
包的解决方案可以使用以下方法:

  • 将1天添加到
    Time2
    ,然后选中
    Time1
    &
    Time2
    属于同一天
  • HHMMSS
    格式中格式化
    Time2
    ,然后检查其是否小于
    120000
    (中午)
  • 守则:

    library(lubridate)
    
    subset(df, format(Time1,"%Y%m%d") == format(Time2+days(1),"%Y%m%d") &
            as.integer(format(Time2, "%H%M%S")) < 120000 )
    
    #                    Time1      Time2 Value
    # 19   2016-11-01 00:00:00 2016-10-31  TRUE
    # 39   2016-11-01 00:30:00 2016-10-31  TRUE
    # 59   2016-11-01 01:00:00 2016-10-31  TRUE
    # 79   2016-11-01 01:30:00 2016-10-31  TRUE
    # 99   2016-11-01 02:00:00 2016-10-31  TRUE
    # 119  2016-11-01 02:30:00 2016-10-31  TRUE
    # 139  2016-11-01 03:00:00 2016-10-31  TRUE
    # 159  2016-11-01 03:30:00 2016-10-31  TRUE
    # 179  2016-11-01 04:00:00 2016-10-31  TRUE
    # 
    # so on
    

    使用
    子集
    润滑油
    包的解决方案可以使用以下方法:

  • 将1天添加到
    Time2
    ,然后选中
    Time1
    &
    Time2
    属于同一天
  • HHMMSS
    格式中格式化
    Time2
    ,然后检查其是否小于
    120000
    (中午)
  • 守则:

    library(lubridate)
    
    subset(df, format(Time1,"%Y%m%d") == format(Time2+days(1),"%Y%m%d") &
            as.integer(format(Time2, "%H%M%S")) < 120000 )
    
    #                    Time1      Time2 Value
    # 19   2016-11-01 00:00:00 2016-10-31  TRUE
    # 39   2016-11-01 00:30:00 2016-10-31  TRUE
    # 59   2016-11-01 01:00:00 2016-10-31  TRUE
    # 79   2016-11-01 01:30:00 2016-10-31  TRUE
    # 99   2016-11-01 02:00:00 2016-10-31  TRUE
    # 119  2016-11-01 02:30:00 2016-10-31  TRUE
    # 139  2016-11-01 03:00:00 2016-10-31  TRUE
    # 159  2016-11-01 03:30:00 2016-10-31  TRUE
    # 179  2016-11-01 04:00:00 2016-10-31  TRUE
    # 
    # so on
    

    以下解决方案有效。解决方案使用
    OP

    library(dplyr)
    library(lubridate)
    
    df %>%
      filter((as.Date(Time2)+days(1)) == as.Date(Time1) & format(Time2, "%H") < 12)
    
    
    #                   Time1      Time2 Value
    # 1   2016-11-01 00:00:00 2016-10-31  TRUE
    # 2   2016-11-01 00:30:00 2016-10-31  TRUE
    # 3   2016-11-01 01:00:00 2016-10-31  TRUE
    # 4   2016-11-01 01:30:00 2016-10-31  TRUE
    # 5   2016-11-01 02:00:00 2016-10-31  TRUE
    # 6   2016-11-01 02:30:00 2016-10-31  TRUE
    # 7   2016-11-01 03:00:00 2016-10-31  TRUE
    # 8   2016-11-01 03:30:00 2016-10-31  TRUE
    # 9   2016-11-01 04:00:00 2016-10-31  TRUE
    # 10  2016-11-01 04:30:00 2016-10-31  TRUE
    # so on
    
    库(dplyr)
    图书馆(lubridate)
    df%>%
    过滤器((截止日期(Time2)+天数(1))==截止日期(Time1)和格式(Time2,“%H”)<12)
    #时间1时间2值
    #1 2016-11-01 00:00:00 2016-10-31真实
    #2 2016-11-01 00:30:00 2016-10-31真实
    #3 2016-11-01 01:00:00 2016-10-31真实
    #4 2016-11-01 01:30:00 2016-10-31真实
    #5 2016-11-01 02:00:00 2016-10-31真实
    #6 2016-11-01 02:30:00 2016-10-31真实
    #7 2016-11-01 03:00:00 2016-10-31真实
    #8 2016-11-01 03:30:00 2016-10-31真实
    #9 2016-11-01 04:00:00 2016-10-31真实
    #10 2016-11-01 04:30:00 2016-10-31真实
    #诸如此类
    
    以下解决方案有效。解决方案使用
    OP

    library(dplyr)
    library(lubridate)
    
    df %>%
      filter((as.Date(Time2)+days(1)) == as.Date(Time1) & format(Time2, "%H") < 12)
    
    
    #                   Time1      Time2 Value
    # 1   2016-11-01 00:00:00 2016-10-31  TRUE
    # 2   2016-11-01 00:30:00 2016-10-31  TRUE
    # 3   2016-11-01 01:00:00 2016-10-31  TRUE
    # 4   2016-11-01 01:30:00 2016-10-31  TRUE
    # 5   2016-11-01 02:00:00 2016-10-31  TRUE
    # 6   2016-11-01 02:30:00 2016-10-31  TRUE
    # 7   2016-11-01 03:00:00 2016-10-31  TRUE
    # 8   2016-11-01 03:30:00 2016-10-31  TRUE
    # 9   2016-11-01 04:00:00 2016-10-31  TRUE
    # 10  2016-11-01 04:30:00 2016-10-31  TRUE
    # so on
    
    库(dplyr)
    图书馆(lubridate)
    df%>%
    过滤器((截止日期(Time2)+天数(1))==截止日期(Time1)和格式(Time2,“%H”)<12)
    #时间1时间2值
    #1 2016-11-01 00:00:00 2016-10-31真实
    #2 2016-11-01 00:30:00 2016-10-31真实
    #3 2016-11-01 01:00:00 2016-10-31真实
    #4 2016-11-01 01:30:00 2016-10-31真实
    #5 2016-11-01 02:00:00 2016-10-31真实
    #6 2016-11-01 02:30:00 2016-10-31真实
    #7 2016-11-01 03:00:00 2016-10-31真实
    #8 2016-11-01 03:30:00 2016-10-31真实
    #9 2016-11-01 04:00:00 2016-10-31真实
    #10 2016-11-01 04:30:00 2016-10-31真实
    #诸如此类
    
    问题已标记为
    数据。表
    。此外,OP提供的样本数据集属于
    data.table类。因此,我觉得有义务发布一个
    数据表
    解决方案:

    library(data.table)
    DT[as.IDate(Time1) - 1L == as.IDate(Time2) & hour(Time2) < 12]
    
    as.IDate()
    是一个具有整数存储的日期类,用于快速排序和分组。因此,我们可以使用整数算法来计算前一天的数据
    hour()
    也由
    data.table
    包提供,并将一天中的小时数作为整数值返回

    可再现数据 2018年5月29日22:00 UTC从复制的数据,但删除了
    .internal.selfref
    指针:

    DT <- structure(
      list(
        Time1 = structure(c(1477958400, 1477958400, 1477958400,
                            1477958400, 1477958400, 1477958400, 1477958400, 1477960200, 1477960200,
                            1477960200, 1477960200, 1477960200, 1477960200, 1477960200, 1477962000,
                            1477962000, 1477962000, 1477962000, 1477962000, 1477962000, 1477962000,
                            1477963800, 1477963800, 1477963800, 1477963800, 1477963800, 1477963800,
                            1477963800), 
                          class = c("POSIXct", "POSIXt"), tzone = "UTC"),
        Time2 = structure(c(1477699200, 1477742400, 1477785600, 1477828800,
                            1477872000, 1477915200, 1477958400, 1477699200, 1477742400,
                            1477785600, 1477828800, 1477872000, 1477915200, 1477958400,
                            1477699200, 1477742400, 1477785600, 1477828800, 1477872000,
                            1477915200, 1477958400, 1477699200, 1477742400, 1477785600,
                            1477828800, 1477872000, 1477915200, 1477958400), 
                          class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
        Value = c("FALSE", "FALSE", "FALSE",
                  "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
                  "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
                  "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
                  "FALSE", "TRUE", "FALSE", "FALSE")), 
      .Names = c("Time1", "Time2", "Value"), 
      row.names = c(NA, -28L), 
      class = c("data.table", "data.frame"))
    

    DT问题已标记为
    data.table
    。此外,OP提供的样本数据集属于
    data.table类。因此,我觉得有义务发布一个
    数据表
    解决方案:

    library(data.table)
    DT[as.IDate(Time1) - 1L == as.IDate(Time2) & hour(Time2) < 12]
    
    as.IDate()
    是一个具有整数存储的日期类,用于快速排序和分组。因此,我们可以使用整数算法来计算前一天的数据
    hour()
    也由
    data.table
    包提供,并将一天中的小时数作为整数值返回

    可再现数据 2018年5月29日22:00 UTC从复制的数据,但删除了
    .internal.selfref
    指针:

    DT <- structure(
      list(
        Time1 = structure(c(1477958400, 1477958400, 1477958400,
                            1477958400, 1477958400, 1477958400, 1477958400, 1477960200, 1477960200,
                            1477960200, 1477960200, 1477960200, 1477960200, 1477960200, 1477962000,
                            1477962000, 1477962000, 1477962000, 1477962000, 1477962000, 1477962000,
                            1477963800, 1477963800, 1477963800, 1477963800, 1477963800, 1477963800,
                            1477963800), 
                          class = c("POSIXct", "POSIXt"), tzone = "UTC"),
        Time2 = structure(c(1477699200, 1477742400, 1477785600, 1477828800,
                            1477872000, 1477915200, 1477958400, 1477699200, 1477742400,
                            1477785600, 1477828800, 1477872000, 1477915200, 1477958400,
                            1477699200, 1477742400, 1477785600, 1477828800, 1477872000,
                            1477915200, 1477958400, 1477699200, 1477742400, 1477785600,
                            1477828800, 1477872000, 1477915200, 1477958400), 
                          class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
        Value = c("FALSE", "FALSE", "FALSE",
                  "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
                  "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
                  "FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
                  "FALSE", "TRUE", "FALSE", "FALSE")), 
      .Names = c("Time1", "Time2", "Value"), 
      row.names = c(NA, -28L), 
      class = c("data.table", "data.frame"))
    

    DT首先,pastebin的代码给出了一个错误“error:unexpected”%filter(time2-time1抱歉,我重新加载了该文件。它以前是一个data.table。现在我上传了一个data.frame。---我不知道如何表述(time2-time1@UDE_学生您的数据非常大。为什么不共享
    dput(head(df,20))
    ?这对每个人来说都会更容易。是的,你是对的,我用较短的版本更新了我的初始帖子:我使用
    lubridate
    在base-R中添加了一个可能的解决方案。请看一看,首先,来自pastebin的代码给出了一个错误“error:unexpected%”过滤器(time2-time1抱歉,我重新上传了这个文件。它以前是一个data.table。现在我上传了一个data.frame。---我不知道如何表达(time2-time1@UDE_Student您的数据非常大。为什么不共享
    dput(head(df,20))
    ?这对每个人来说都会更容易。是的,你是对的,我用较短的版本更新了我的初始帖子:我使用
    lubridate在base-R中添加了一个可能的解决方案。看一看,两条小评论。1)您不需要在
    dplyr
    链中使用
    $
    。也许,您应该在
    OP
    共享的数据上尝试您的解决方案,并检查它是否返回有效的输出。两个小注释。1)您不需要在
    dplyr
    链中使用
    $
    。也许,您应该在
    OP
    共享的数据上尝试您的解决方案,并检查它是否返回有效的输出。很好地使用
    as.IDate
    !实际上,
    OP
    提供的数据在
    data.frame
    中。我想提供一个base-R解决方案,以便t
    原始
    结果中的行名称,让OP知道选择了哪些行