为什么sqldf在r中将datetime转换为local,而data.table没有?

qmelpv7a  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(327)

下面是简单代码:

  1. library(sqldf)
  2. library(data.table)
  3. OwnerUserId <- c(24612)
  4. CreationDate <- c("2016-05-27 03:17:41")
  5. DataTable <- data.table(OwnerUserId, CreationDate)
  6. write.csv(DataTable, "DataTable.csv")
  7. DataTable <- fread("DataTable.csv", stringsAsFactors = TRUE)
  8. sqldf("
  9. SELECT OwnerUserId, CreationDate
  10. FROM DataTable
  11. WHERE OwnerUserId == 24612
  12. ")
  13. DataTable[OwnerUserId == 24612, .(OwnerUserId, CreationDate),]

产生以下输出:

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

我只是好奇这种行为是否在意料之中。
如果是,那么如何通过sqldf和data.table得到相同的结果?

mnowg1ta

mnowg1ta1#

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

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

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

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

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

  1. sqldf("
  2. SELECT OwnerUserId, CreationDate
  3. FROM DataTable
  4. WHERE OwnerUserId == 24612
  5. ")
  6. # OwnerUserId CreationDate
  7. # 1 24612 2016-05-27 03:17:41

如果非要我猜的话,我的钱会在上面,因为它在某个地方被参照物改变了。你能在freshr会话上运行这里的代码,看看是否仍然得到相同的结果吗?
编辑:也看看什么 getOption("sqldf.method") 你的回报。它可能使用了“name\uu class”,但即使这样也不太可能产生这样的结果。

展开查看全部

相关问题