首页 > 解决方案 > R 中 sqldf 中的 min(date) 未转换为日期格式

问题描述

数据:

test <- read.table(text = "
user_id    event_captured_dt     send_dt
656072342         2016-12-30  2016-10-24
656072342         2016-11-10  2016-10-24
656072342         2016-11-15  2016-10-24
656072342         2016-11-21  2016-10-24
656072342         2016-11-23  2016-10-24
656072342         2017-03-07  2016-10-24
", header = TRUE)
test$event_captured_dt <- as.Date(test$event_captured_dt,format = '%Y-%m-%d')
test$send_dt <- as.Date(test$send_dt,format = '%Y-%m-%d')

我在 sqldf 中查询 min(send_date) 但它给出了 int 格式 op,但我需要它的日期格式。

sqldf('select date(min(event_captured_dt), "unixepoch","localtime") min_dt, send_dt from test group by send_dt')

预期 o/p 为:min_dt send_dt 1 2016-11-10 2016-10-24 当前 o/p 为:min_dt send_dt 1 1970-01-01 2016-10-24

标签: rsqldf

解决方案


这已在 SO 上多次回答,也是 sqldf 常见问题解答。请参阅常见问题解答 #4。sqldf 如何处理“日期”类变量?https://github.com/ggrothendieck/sqldf

重申一下,默认后端 SQLite 没有日期类型。

H2

如果你想使用 Date 类变量,最简单的方法是使用 RH2 后端,因为 H2 确实有日期类型。如果加载了 RH2,sqldf 会注意到它并使用它。

library(RH2)
library(sqldf)

sqldf('select 
    min(event_captured_dt) min_dt,
    send_dt 
  from test
  group by send_dt')
##       min_dt    send_dt
## 1 2016-11-10 2016-10-24

SQLite

如果您想使用默认的 RSQLite 后端,请确保未加载 RH2(或按其他方式将 SQLite 指定为 sqldf ?sqldf)。您可以使用verbose=TRUE参数来sqldf获取更多信息,包括正在使用哪个后端。

由于 SQLite 不支持日期Date类变量以数字形式(自 UNIX 纪元以来的天数)发送到 SQLite,并且类似地返回到 R。如果sqldf参数method="auto"有效(通常是因为这是默认值),那么它将解释返回的数字列,就Date好像该列的名称是Date输入中的类一样。如果将方法更改为,method="Date"则返回的所有数字列都将被视为Date. 如果您使用method="name__class"then 如果返回的列的名称以两个下划线和一个 R 类名称结尾,则sqldf会将列转换为该类并从名称中删除下划线和类。因此,这些将起作用。确保未加载 RH2。(如果已加载,请将其卸载或重新启动 R。)有关更多信息,请参阅method参数的文档。?sqldf

library(sqldf)

# using method="Date"
sqldf('select 
    min(event_captured_dt) min_dt,
    send_dt 
  from test
  group by send_dt', method = "Date")
##       min_dt    send_dt
## 1 2016-11-10 2016-10-24

或者

library(sqldf)

# using method="name__class"
sqldf('select 
    min(event_captured_dt) min_dt__Date,
    send_dt send_dt__Date
  from test
  group by send_dt', method = "name__class")
##       min_dt    send_dt
## 1 2016-11-10 2016-10-24

推荐阅读