与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转换回原来,有什么建议吗?
谢谢你,约翰
发布于 2017-11-05 01:55:28
问题是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:102)方法参数显式地告诉sqldf使用method参数分配哪些类:
sqldf("select min(u.created_on) as min_date__POISXt from user u", method = "POSIXct")
## min_date
## 1 2017-02-15 19:39:103) H2,而不是使用默认的SQLite后端,而是使用H2后端。H2确实支持datetime类,因此它按预期工作。如果您为RH2加载了H2驱动程序包,那么sqldf会注意到它,并使用该数据库而不是SQLite。(还可以使用"sqldf.driver"选项和sqldf的drv=参数来指定后端--参见?sqldf和sqldf主页上的信息。)
library(RH2)
sqldf("select min(u.created_on) as min_date from user u")
## min_date
## 1 2017-02-15 19:39:10发布于 2017-11-05 01:27:57
SQLite将类似于日期时间的对象存储为数值对象,通常是划时代秒。这是不可避免的。
如果你读了?as.POSIXct,你会看到
## S3 method for class 'numeric'
as.POSIXlt(x, tz = "", origin, ...)以及以后的
起源:日期时间对象,或由as.POSIXct(tz = "GMT")胁迫到这样一个对象的东西。
as.POSIXct(1380749081, origin="1970-01-01")
# [1] "2013-10-02 14:24:41 PDT"https://stackoverflow.com/questions/47116734
复制相似问题