【问题标题】:sqldf: Changes timestamp from localtime to GMT/UTCsqldf:将时间戳从本地时间更改为 GMT/UTC
【发布时间】:2012-03-20 07:19:45
【问题描述】:

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

> 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
> 

【问题讨论】:

    标签: r sqldf


    【解决方案1】:

    这似乎是 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"的示例

    【讨论】:

    • 谢谢! http 源的补丁有效,我将使用它。第二个确实转换为原始数字,但原始数字仍然转换为当重铸回 POSIXct 时处于格林威治标准时间的数字。再次感谢,马特。
    • 建议您检查您是如何将其转换回来的。从我添加到答案的代码中可以看出,它给出了相同的数字。
    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 2010-09-15
    • 2019-08-15
    • 2022-11-23
    • 2023-03-26
    • 2019-03-09
    相关资源
    最近更新 更多