2012-03-01 194 views
8

在我的机器上,sqldf将本地时间(我在CST,GMT -0600)的POSIXct更改为GMT/UTC。这是预期的行为?我可以停止R或sqldf吗?这里是我的代码:sqldf:将本地时间到GMT/UTC的时间戳更改为

> library('sqldf') 
> 
> before <- data.frame(ct_sys = Sys.time()) 
> before 
       ct_sys 
1 2012-03-01 12:57:58 
> after <- sqldf('select * from before') 
> after 
       ct_sys 
1 2012-03-01 18:57:58 
> 

回答

3

这似乎是sqldf中的时区错误。它现在应该是固定在sqldf版本0.4-6.2(尚未在CRAN,但你可以尝试一下这样的):

library(sqldf) 
source("http://sqldf.googlecode.com/svn/trunk/R/sqldf.R") 
before <- data.frame(ct_sys = Sys.time()); before 
after <- sqldf('select * from before'); after 

即使没有这样做,sqldf("select * from before", method = "raw")将工作虽然将返回数值列(你可以转换为POSIXct)并可能影响其他列。以下是使用method = "raw"的示例。请注意,在这两种情况下,我们得到1330661786.181

> library(sqldf) 
> 
> before <- data.frame(ct_sys = Sys.time()); dput(before) 
structure(list(ct_sys = structure(1330661786.181, class = c("POSIXct", 
"POSIXt"))), .Names = "ct_sys", row.names = c(NA, -1L), class = "data.frame") 
> 
> after <- sqldf('select * from before', method = "raw"); dput(after) 
structure(list(ct_sys = 1330661786.181), .Names = "ct_sys", row.names = 1L, class = "data.frame") 

编辑:使用method = "raw"

+0

谢谢你的加入例子!来自http源的补丁工作,我会用它。第二个确实转换为原始数据,但原始数据仍然转换为重新转换为POSIXct时的格林威治标准时间。再次感谢,马特。 – mpettis 2012-03-02 02:31:23

+0

建议您检查如何将其转换回来。正如你从我添加到答案的代码中可以看到的,它给出了相同的数字。 – 2012-03-02 04:20:43