sqldf和POSIXct

时间:2017-11-04 23:37:13

标签: r posixct sqldf

遇到问题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转换回日期的任何建议?

谢谢你, 约翰

2 个答案:

答案 0 :(得分:2)

问题是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"选项和drv= sqldf参数可用于指定后端 - 请参阅?sqldf以及sqldf github主页上的信息。)< / p>

library(RH2)

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

答案 1 :(得分:0)

SQLite将类似日期时间的对象存储为数字,通常为epoch seconds。这是不可避免的。

如果您阅读?as.POSIXct,则会看到

## S3 method for class 'numeric'
as.POSIXlt(x, tz = "", origin, ...)

以后

  

origin:一个日期时间对象,或者可以被as.POSIXct(tz =“GMT”)强制转换为这样一个对象。

as.POSIXct(1380749081, origin="1970-01-01")
# [1] "2013-10-02 14:24:41 PDT"