使用sqldf从日期部分的数据框中过滤查询

时间:2019-01-15 03:01:20

标签: r

我正在尝试基于某些日期部分提取并加入2个数据框,但无法正常工作。数据帧如下:-

startdf

startperiod
2015-10-01
2016-10-01
2017-10-01
2018-10-01


enddf

endperiod
2016-03-31
2017-03-31
2018-03-31

startperiodendperiod均为'Date'数据类型

这是我想要的最终输出:-

startperiod, endperiod
2015-10-01  2016-03-31
2016-10-01  2017-03-31
2017-10-01  2018-03-31
2018-10-01  Null

等效的SQL将是这样的:-

Select startperiod, endperiod
From startdf a lef join enddf b
On year(b.endperiod) = (year(a.startperiod) + 1)

在R中有什么方法可以做吗?我相信我需要使用库sqldfRH2,但是无论如何我都无法使用它。

简单地说,这应该可以,但是不可以!

sqldf("Select * from startperioddf a where year(startperiod) = 2016")

2 个答案:

答案 0 :(得分:1)

1)RH2 假设

  • 以下注释中以可重复形式显示的数据。特别要注意,假设startdateenddate属于Date类。
  • 问题中的
  • 错别字是固定的
  • 使用h2数据库后端而不是默认的sqlite

然后您的代码有效:

library(sqldf)
library(RH2)

sql <- "Select startperiod, endperiod
  From startdf a left join enddf b
  On year(b.endperiod) = (year(a.startperiod) + 1)"
sqldf(sql)

给予:

  startperiod  endperiod
1  2015-10-01 2016-03-31
2  2016-10-01 2017-03-31
3  2017-10-01 2018-03-31
4  2018-10-01       <NA>

sqldf("Select * from startdf a where year(startperiod) = 2016")

给予:

  startperiod
1  2016-10-01

请务必阅读sqldf github网站上的资料:https://github.com/ggrothendieck/sqldf

2)sqlite 如果要使用默认的sqlite后端,请确保未加载RH2(否则,它将假定您要使用它),并请注意Date类变量将是作为整数上传到sqlite,代表自unix纪元以来的天数(因为sqlite中没有Date类类型),因此我们需要将epoch以来的天数转换为年份(可以使用strftime完成,如图所示)

sql2 <- "Select startperiod, endperiod
  From startdf a left join enddf b
  On strftime('%Y', b.endperiod * 3600 * 24, 'unixepoch') + 0 = 
     strftime('%Y', a.startperiod * 3600 * 24, 'unixepoch') + 1"
sqldf(sql2)

sqldf("Select * from startdf a 
  where strftime('%Y', a.startperiod * 3600 * 24, 'unixepoch') = '2016'")

注意

Lines1 <- "
startperiod
2015-10-01
2016-10-01
2017-10-01
2018-10-01"

Lines2 <- "
endperiod
2016-03-31
2017-03-31
2018-03-31"

startdf <- read.table(text = Lines1, header = TRUE, colClasses = "Date")
enddf <- read.table(text = Lines2, header = TRUE, colClasses = "Date")

答案 1 :(得分:0)

R中的sqldf软件包默认情况下使用SQLite数据库引擎。因此,您无法在查询中使用year函数从日期中提取年份部分。以下查询将完成这项工作:

sqldf("Select * from startdf where strftime('%Y', startperiod) = '2016'")

它使用SQLite的strftime函数比较特定日期部分。 year函数是在MySQL下定义的,因此您可能必须安装RMySQL软件包,然后使用drv = 'MySQL'参数指定所需的数据库引擎{{1} }。