与sqldf和&POSIXct。将感谢的任何帮助
Sys.setenv(TZ = "America/Los_Angeles")
user <- read.csv("user_ori.csv",stringsAsFactors=FALSE)
user$created_on <- as.POSIXct(user$created_on,format="%Y-%m-%d %H:%M:%S",tz="America/Los_Angeles")
head(user$created_on)
[1] "2017-02-15 19:39:10 PST" "2016-05-11 22:44:58 PDT"
[3] "2017-02-06 19:25:48 PST" "2016-09-22 22:25:50 PDT"
[5] "2016-07-11 10:36:58 PDT" "2015-02-23 20:42:12 PST"
不知道为什么我混合了PST和PDT,但继续…
user.mindate <- sqldf("select min(u.created_on) as min_date
from user u")
> user.mindate
min_date
1 1380749081
> as.Date(user.mindate$min_date,tz="America/Los_Angeles")
[1] "3782332-08-02"
关于如何将min_date转换回date,有什么建议吗?
谢谢,约翰·
问题是SQLite没有日期时间类型。R将POSIXct对象存储为自1970-01-01(Epoch)以来的秒数,当这样的对象被发送到SQLite时,由于没有相应的类型,它只是作为原始秒数发送,即一个数字。当它在处理后被发送回R时,它仍然只是一个数字。
有几种方法可以处理这个问题:
1)列名将要成为POSIXct的输出列名与最初的列名相同。sqldf
有一个启发式方法,它查看输入列和输出列的名称,如果其中任何一个匹配,则它假设输出应该转换为该名称的输入列所具有的相同类。
sqldf("select min(u.created_on) as created_on from user u")
## created_on
## 1 2017-02-15 19:39:10
2)方法参数使用method
参数显式告诉sqldf要分配什么类:
sqldf("select min(u.created_on) as min_date__POISXt from user u", method = "POSIXct")
## min_date
## 1 2017-02-15 19:39:10
3)H2与其使用默认的SQLite后端,不如使用H2后端。H2确实支持日期时间类,因此它可以按预期工作。如果您为H2加载RH2驱动程序包,那么sqldf会注意到它,并使用该数据库而不是SQLite。(此外,"sqldf.driver"
选项和sqldf
的drv=
参数可用于指定后端——请参阅?sqldf
和sqldf-github主页上的信息。)
library(RH2)
sqldf("select min(u.created_on) as min_date from user u")
## min_date
## 1 2017-02-15 19:39:10
SQLite将类似日期时间的对象存储为数字,通常为epoch秒。这是不可避免的。
如果你阅读?as.POSIXct
,你会看到
## S3 method for class 'numeric'
as.POSIXlt(x, tz = "", origin, ...)
以及后来的
origin:一个日期-时间对象,或者可以被作为.POSIXct(tz="GMT")强制到这样一个对象的东西。
as.POSIXct(1380749081, origin="1970-01-01")
# [1] "2013-10-02 14:24:41 PDT"