微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 sqldf 将日期时间转换为 R 中的本地,而 data.table 没有?

如何解决为什么 sqldf 将日期时间转换为 R 中的本地,而 data.table 没有?

以下简单代码

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
1:       24612 2016-05-27 03:17:41

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

解决方法

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”,但即使如此也不太可能产生这种结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?