【问题标题】:Subsetting dates that are equal to or later than a specified date [duplicate]子集日期等于或晚于指定日期[重复]
【发布时间】:2020-12-14 13:07:23
【问题描述】:

我有一个包含两个日期列的数据框。 Date2 列中的所有日期都相同。

Date1<-c("16/11/2007 17:00:00", "17/11/2007 01:02:00", "17/11/2007 05:00:00", "17/11/2007 09:00:00", "17/11/2007 13:00:00", "17/11/2007 17:00:00", "18/11/2007 01:00:00", "18/11/2007 05:00:00")
Date2<-rep("17/11/2007 17:00:00",times=8)
Data<-data.frame(Date1,Date2)
Data

  Date1               Date2
 16/11/2007 17:00:00 17/11/2007 17:00:00
 17/11/2007 01:02:00 17/11/2007 17:00:00
 17/11/2007 05:00:00 17/11/2007 17:00:00
 17/11/2007 09:00:00 17/11/2007 17:00:00
 17/11/2007 13:00:00 17/11/2007 17:00:00
 17/11/2007 17:00:00 17/11/2007 17:00:00
 18/11/2007 01:00:00 17/11/2007 17:00:00
 18/11/2007 05:00:00 17/11/2007 17:00:00

我想对我的数据进行子集化,以使 Date1 中的所有日期都等于或晚于 Date2 中的日期。 以下是所需的输出:

Data[4:8,]

  Date1               Date2
 17/11/2007 17:00:00 17/11/2007 17:00:00
 18/11/2007 01:00:00 17/11/2007 17:00:00
 18/11/2007 05:00:00 17/11/2007 17:00:00

任何帮助将不胜感激!

【问题讨论】:

    标签: r dataframe date subset


    【解决方案1】:

    我们将“日期”列转换为Datetime 类和filter

    library(dplyr)
    library(lubridate)
    Data %>% 
        mutate(across(starts_with('Date'), dmy_hms)) %>% 
        filter(Date1 >= Date2)
    #         Date1               Date2
    #1 2007-11-17 17:00:00 2007-11-17 17:00:00
    #2 2007-11-18 01:00:00 2007-11-17 17:00:00
    #3 2007-11-18 05:00:00 2007-11-17 17:00:00
    

    base R 中,这可以通过as.POSIXct 完成

    subset(Data, as.POSIXct(Date1, format = "%d/%m/%Y %H:%M:%S") >= 
               as.POSIXct(Date2, format = "%d/%m/%Y %H:%M:%S"))
    

    【讨论】:

      【解决方案2】:

      在将日期列转换为日期类型后,您可以只使用 filter() 来“过滤”满足您条件的数据。 @Akrun 的回答是最简洁的,但是如果您想将 Date1 和 Date2 列保留为字符串,您可以改为创建新列用于过滤,然后在之后将其删除。

      Data %>%
          mutate(Date1_datetime_type = dmy_hms(Date1), #new columns to use for filtering
                 Date2_datetime_type = dmy_hms(Date2)) %>%
          filter(Date1_datetime_type >= Date2_datetime_type) %>% #your condition
          select(Date1, Date2) #selecting only the original columns
      

      你会得到

      #                Date1               Date2
      #1 17/11/2007 17:00:00 17/11/2007 17:00:00
      #2 18/11/2007 01:00:00 17/11/2007 17:00:00
      #3 18/11/2007 05:00:00 17/11/2007 17:00:00
      

      编辑:写得太快,忘记更改日期列的类型。还添加了一个用例(将原始数据保留在相同的数据类型中)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多