与R中的系统日期的日期比较

时间:2018-03-07 09:23:54

标签: r date compare

我想比较一个结束日期(end_date)列的数据和系统日期(todays_date)。两列都是char格式。

Input:
$ name: chr  "Abby" "Abby" "Abby" "Abby" ...
$ std: int  2 3 4 5 6 7 8 9 10 11 ...
$ end_date: chr  "25-02-2016" "25-02-2016" "25-03-2018" "25-02-2019" ...
$ todays_date: chr  "07-03-2018" "07-03-2018" "07-03-2018" "07-03-2018" ...

我有没有办法传递sqldf语句,我可以获取输入csv的所有值,其中end_date<今天的日期?除sqldf语句以外的任何方式,我可以提取csv的值,其中end_date< todays_date会做的。

我尝试了以下查询的一些可能的变体,但我似乎无法获得所需的输出:

sel_a <- sqldf(paste("SELECT * FROM input_a WHERE end_date<", 
todays_date, "", sep = ""))
sel_a

PS:我有大量的数据,并且减少了它以适应这个问题。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

要获得更具体的答案,请制作reproducible example

将日期列从字符转换为日期时间对象,例如,使用

library(lubridate)
your_df$end_date <- mdy(your_df$end_date)

然后,您甚至不需要今天日期的列,只需将其用作过滤条件

library(dplyr)
filter(your_df, end_date < Sys.Date())
# will return a data frame with those rows that have a date before today.

或者如果您愿意:

your_df[your_df$end_date < Sys.Date(),]
# produces the same rows

答案 1 :(得分:1)

使用末尾注释中显示的原始输入,首先将日期转换为"Date"类,然后使用显示的任何替代方法。前两个使用输入中的end_date,后两个使用Sys.Date()。我们展示了sqldf和基础解决方案。

library(sqldf)
fmt <- "%d-%m-%Y"
Input <- transform(Input_raw, end_date = as.Date(end_date, fmt),
                              todays_date = as.Date(todays_date, fmt))

# 1
sqldf("select * from Input where end_date <= todays_date")

# 2
subset(Input, end_date <= todays_date)

# 3
fn$sqldf("select * from Input where end_date <= `Sys.Date()`")

# 4
subset(Input, end_date <= Sys.Date())

注意

Input可重现的形式:

Input_raw <- data.frame(name = "Abby", std = 2:5, 
  end_date = c("25-02-2016", "25-02-2016", "25-03-2018", "25-02-2019"),
  todays_date = "07-03-2018", stringsAsFactors = FALSE)