首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqldf和POSIXct

sqldf和POSIXct
EN

Stack Overflow用户
提问于 2017-11-04 23:37:12
回答 2查看 825关注 0票数 2

与sqldf和& POSIXct有关的问题。会很感激你的帮助

代码语言:javascript
复制
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的混合,但是继续.

代码语言:javascript
复制
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转换回原来,有什么建议吗?

谢谢你,约翰

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-05 01:55:28

问题是SQLite没有日期时间类型。R将POSIXct对象存储为自1970-01-01 ( Epoch)以来的秒数,当这样的对象由于没有相应的类型而被发送到SQLite时,它只是作为原始的秒数发送,即一个数字。当它被发送回R后,经过处理,它仍然只是一个数字。

有几种方法可以解决这一问题:

1)列名给出了输出列名,即POSIXct与原来的名称相同。sqldf有一个启发式方法,它查看输入和输出列名,如果它们中的任何一个匹配,那么它假设输出应该转换为与该名称的输入列相同的类。

代码语言:javascript
复制
sqldf("select min(u.created_on) as created_on from user u")
##            created_on
## 1 2017-02-15 19:39:10

2)方法参数显式地告诉sqldf使用method参数分配哪些类:

代码语言:javascript
复制
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确实支持datetime类,因此它按预期工作。如果您为RH2加载了H2驱动程序包,那么sqldf会注意到它,并使用该数据库而不是SQLite。(还可以使用"sqldf.driver"选项和sqldfdrv=参数来指定后端--参见?sqldf和sqldf主页上的信息。)

代码语言:javascript
复制
library(RH2)

sqldf("select min(u.created_on) as min_date from user u")
##              min_date
## 1 2017-02-15 19:39:10
票数 3
EN

Stack Overflow用户

发布于 2017-11-05 01:27:57

SQLite将类似于日期时间的对象存储为数值对象,通常是划时代秒。这是不可避免的。

如果你读了?as.POSIXct,你会看到

代码语言:javascript
复制
## S3 method for class 'numeric'
as.POSIXlt(x, tz = "", origin, ...)

以及以后的

起源:日期时间对象,或由as.POSIXct(tz = "GMT")胁迫到这样一个对象的东西。

代码语言:javascript
复制
as.POSIXct(1380749081, origin="1970-01-01")
# [1] "2013-10-02 14:24:41 PDT"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47116734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档