R sqldf 无法识别 posixct
R sqldf not recognizing posixct
我需要按日期过滤数据使用 sqldf 包。
我的 table,"episodes" 有一个字段“created_at,class 是 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' ")
首先请注意,库是存储包的存储库,因此 sqldf 是包,而不是库。由于 library
命令的不幸名称,这通常是混淆的根源。
sqldf
本身不支持 $ 替换。为此,您需要使用 fn$sqldf
,其中 fn
来自 sqldf 包自动加载的 gsubfn 包。它将这种替换添加到它作为序言的任何函数的参数中。参见 ?fn
另请注意,SQLite 数据库没有日期或日期时间 classes,因此 sqldf 只是将 POSIXct 的内部表示形式发送到 SQLite,即一个普通数字,表示自大纪元以来相对于 GMT 的秒数.请注意,POSIXct 的内部表示始终是自纪元 以来相对于 GMT 的秒数,即使它显示相对于不同时区的日期和时间也是如此。因此 episodes$created_at
和 fechSig
都从 R 发送到 SQLite,作为自大纪元 相对于 GMT 以来的秒数,即使它们在 R 中不以这种方式显示。当 R 从数据库接收到一个字段(此时它只是一个普通数字)时,sqldf 检查该字段名称是否最初是 POSIXct class,如果是,它将强制返回 POSIXct 的数字。启发式不处理时区,因此它存储为相对于 GMT(所有 POSIXct 变量都是),并显示在本地时区,这是 POSIXct 的默认行为。
在下面的注释中,GMT 比 EDT 早 4 小时,比 EST 早 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"
如果您更喜欢在格林威治标准时间工作,那么请确保本地时区是格林威治标准时间,如下所示:
Sys.setenv(TZ = "GMT")
range(out$created_at)
## [1] "2016-10-02 01:00:00 GMT" "2017-01-08 01:00:00 GMT"
我需要按日期过滤数据使用 sqldf 包。
我的 table,"episodes" 有一个字段“created_at,class 是 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' ")
首先请注意,库是存储包的存储库,因此 sqldf 是包,而不是库。由于 library
命令的不幸名称,这通常是混淆的根源。
sqldf
本身不支持 $ 替换。为此,您需要使用 fn$sqldf
,其中 fn
来自 sqldf 包自动加载的 gsubfn 包。它将这种替换添加到它作为序言的任何函数的参数中。参见 ?fn
另请注意,SQLite 数据库没有日期或日期时间 classes,因此 sqldf 只是将 POSIXct 的内部表示形式发送到 SQLite,即一个普通数字,表示自大纪元以来相对于 GMT 的秒数.请注意,POSIXct 的内部表示始终是自纪元 以来相对于 GMT 的秒数,即使它显示相对于不同时区的日期和时间也是如此。因此 episodes$created_at
和 fechSig
都从 R 发送到 SQLite,作为自大纪元 相对于 GMT 以来的秒数,即使它们在 R 中不以这种方式显示。当 R 从数据库接收到一个字段(此时它只是一个普通数字)时,sqldf 检查该字段名称是否最初是 POSIXct class,如果是,它将强制返回 POSIXct 的数字。启发式不处理时区,因此它存储为相对于 GMT(所有 POSIXct 变量都是),并显示在本地时区,这是 POSIXct 的默认行为。
在下面的注释中,GMT 比 EDT 早 4 小时,比 EST 早 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"
如果您更喜欢在格林威治标准时间工作,那么请确保本地时区是格林威治标准时间,如下所示:
Sys.setenv(TZ = "GMT")
range(out$created_at)
## [1] "2016-10-02 01:00:00 GMT" "2017-01-08 01:00:00 GMT"