R sqldf无法识别posixct

时间:2016-10-29 23:08:04

标签: r date posixct sqldf

我需要使用sqldf包按日期过滤数据。

我的桌子,"剧集"有一个字段" created_at,该类是POSIXct。

episodes<-data.frame(created_at=seq(from = as.POSIXct('2016-10-01 01:00:00',tz="GMT"), length.out = 100, by = "days") )

> class(episodes$created_at)
[1] "POSIXct" "POSIXt" 

我第二次约会:

fechaMin=min(episodes$created_at)

library(lubridate)
fechaSig=fechaMin+hours(24)

然后我用以下内容过滤数据:

 sqldf("SELECT * from episodes e 
where strftime('%Y/%m/%d', e.created_at, 'unixepoch')>='$fechaSig' ")

但我得到了所有数据。过滤器无法正常工作。

我也尝试过没有成功:

    sqldf("SELECT * from episodes e 
where date(e.created_at, 'unixepoch', 'localtime')>='$fechaSig' ")

1 个答案:

答案 0 :(得分:1)

首先请注意,库是存储包的存储库,因此sqldf是包,而不是库。由于library命令的不幸名称,这通常会引起混淆。

sqldf本身不支持$替换。为此,您需要使用fn$sqldf fn来自sqldf软件包自动加载的gsubfn软件包。它将这种替换添加到它前言的任何函数的参数中。见?fn

另请注意,SQLite数据库没有日期或日期时间类,因此sqldf只将POSIXct的内部表示发送给SQLite,即表示自Epoch以来相对于GMT的秒数的普通数字。请注意,POSIXct的内部表示始终是自Epoch 相对于GMT 以来的秒数,即使它显示相对于不同时区的日期和时间。因此episodes$created_atfechSig都是从R发送到SQLite,因为Epoch 相对于GMT ,即使它们都没有在R中显示那个方式。当R接收时从数据库返回的字段(此时它只是一个普通数字)sqldf检查字段名称是否最初是POSIXct类,如果是,则强制它返回到POSIXct的数字。启发式不处理时区,因此它相对于GMT存储(与所有POSIXct变量一样),并且它显示在本地时区,这是POSIXct的默认行为。

在下面的说明中,格林威治标准时间比美国东部时间早4小时,比美国东部时间早5小时,所以答案是正确的。

episodes <- data.frame(created_at = 
 seq(from = as.POSIXct('2016-10-01 01:00:00',tz="GMT"), length.out = 100, by = "days") )

fechaMin <- min(episodes$created_at)

library(lubridate)
fechaSig <- fechaMin + hours(24) # or fechaMin+as.difftime(1,units="hours") w/o lubridate

library(sqldf)
out <- fn$sqldf("select * from episodes where created_at >= $fechaSig")

range(episodes$created_at)
## [1] "2016-10-01 01:00:00 GMT" "2017-01-08 01:00:00 GMT"
range(out$created_at)
## [1] "2016-10-01 21:00:00 EDT" "2017-01-07 20:00:00 EST"

如果您更喜欢在GMT中工作,请确保当地时区为GMT,如下所示:

 Sys.setenv(TZ = "GMT")
 range(out$created_at)
 ## [1] "2016-10-02 01:00:00 GMT" "2017-01-08 01:00:00 GMT"