【问题标题】:Why does sqldf convert datetime to local in R while data.table doesn't?为什么 sqldf 将日期时间转换为 R 中的本地时间,而 data.table 没有?
【发布时间】:2021-07-19 14:45:22
【问题描述】:

以下简单代码:

library(sqldf)
library(data.table)

OwnerUserId <- c(24612)
CreationDate <- c("2016-05-27 03:17:41")

DataTable <- data.table(OwnerUserId, CreationDate)

write.csv(DataTable, "DataTable.csv")

DataTable <- fread("DataTable.csv", stringsAsFactors = TRUE)

sqldf("
    SELECT OwnerUserId, CreationDate
    FROM DataTable
    WHERE OwnerUserId == 24612
  ")

DataTable[OwnerUserId == 24612, .(OwnerUserId, CreationDate),]

产生以下输出:

  OwnerUserId        CreationDate
1       24612 2016-05-27 09:17:41

> DataTable[OwnerUserId == 24612, .(OwnerUserId, CreationDate),]
   OwnerUserId        CreationDate
1:       24612 2016-05-27 03:17:41

我只是好奇这种行为是否符合预期。
如果是,那么我们如何通过 sqldf 和 data.table 得到相同的结果?

【问题讨论】:

  • @G.Grothendieck 是的,"Sys.setenv(TZ = "UTC")" 解决了这个问题。在问了这个问题后,我也尝试了这个。但是,还有一个与类型不匹配(本地与 UTC 类型)有关的问题。无论如何,这是另一个故事。感谢您的评论!
  • 请务必阅读整个主题。 Sys.setenv 只是其中一种解决方案。
  • @G.Grothendieck 现在我阅读了整个线程。很多变通办法。再次感谢!

标签: sql r data.table sqldf


【解决方案1】:

csv 的内容,注意没有提到任何时区

# "","OwnerUserId","CreationDate"
# "1",24612,"2016-05-27 03:17:41" 

当你读入它时,fread 将它作为一个因素,因为它只是一个字符串,你没有给它任何理由去思考。

DataTable <- fread("DataTable.csv", stringsAsFactors = TRUE)
DataTable[, str(CreationDate)]
# Factor w/ 1 level "2016-05-27 03:17:41": 1

当我运行 sqldf 时,我得到了我所期望的,它与 data.table 相同。

sqldf("
    SELECT OwnerUserId, CreationDate
    FROM DataTable
    WHERE OwnerUserId == 24612
  ")
#   OwnerUserId        CreationDate
# 1       24612 2016-05-27 03:17:41

如果我不得不猜测,我的钱会在某处通过引用进行更改。你能在新的 R 会话上运行这里的代码,看看你是否仍然得到相同的结果?

编辑:同时查看getOption("sqldf.method") 为您返回的内容。它可能使用了“name__class”,但即使这样也不太可能产生这种结果。

【讨论】:

  • 感谢您的回复。据我了解,您无法重现上述问题。重新启动 R 会话(IDE 已重新启动)后,我又检查了一次。将 SO 代码复制粘贴到新创建的文件中。出现同样的问题。 getOption("sqldf.method") 只返回 NULL。我猜你的电脑使用“GMT+0”,这就是你无法重现问题的原因。
  • 我不认为这是原因。事实上,字符串从来没有成为我的日期。它仍然是一个字符串或创建时的一个因素,并且 sqldf 和 data.table 在调用时都返回一个字符串。如果有什么东西导致字符串变成日期,那就是你需要找到的。
  • 我明白了。谢谢!无论如何,令人难以置信的是,相同的代码给你和我带来不同的结果。让我问你使用的是哪个版本的 R。我的 R 版本是:version.string R version - 4.0.5 (2021-03-31), svn rev - 80133.
猜你喜欢
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2021-05-02
  • 2018-07-15
  • 2015-05-31
  • 2021-03-18
相关资源
最近更新 更多