R

时间:2016-04-18 02:55:11

标签: r date sqldf

我在数据框中有两列我需要计算时间差。数据是来自城市开放数据的本地PD数据。一列在下面

TimeDispatch             
01/01/2011 12:00:37 AM   

TimeArrive
01/01/2011 12:21:31 AM

TimeArrival也是一些缺失值,因为每次调度都不需要警察到达。

我试图在R中使用sqldf找到差异,但它说出了这个错误

Error in sqliteSendQuery(conn, statement, bind.data) : 
  RAW() can only be applied to a 'raw', not a 'double'
In addition: Warning message:
In sqliteSendQuery(con, statement, bind.data) :
  Closing result set with pending rows

任何帮助人员?

2 个答案:

答案 0 :(得分:3)

从评论到问题,问题不在于如何使用sqlite计算两次差异。在将它们发送到sqlite之前,时间已经不同了,问题是生成的"difftime"类列在发送到sqlite时会转换为数字,当它被检索回到R时,sqldf会不知道如何将该数字转换回"difftime"类对象,因为它不知道要使用哪个单位。

这是一个自包含的例子来说明:

library(sqldf)

now <- Sys.time()
now2 <- now + 1
dif <- difftime(now2, now)
DF <- data.frame(dif)

sqldf("select * from DF")
## Error in asfn(rs[[i]]) : need explicit units for numeric conversion

有几种方法:

1)首先不要使用"difftime"对象。使用秒数或分钟数或其他任何数字变量:

DF1 <- data.frame(dif = as.numeric(dif))
sqldf("select * from DF1")

##   dif
## 1   1

2)在SQL中而不是在R中执行差异,以便首先不创建"difftime"列:

DF2 <- data.frame(now, now2)
sqldf("select now2 - now as dif from DF2")

##   dif
## 1   1

3)使用sqldf(..., method = "raw")阻止它尝试转换回"difftime"类:

sqldf("select * from DF")

##   dif
## 1   1

4)确保在输出中重命名原始"difftime"列,以便它不能将其与原始"difftime"列关联,因此分配类的启发式操作不会尝试转换它。

sqldf("select dif as dif2 from DF")

##   dif2
## 1    1

5)使用sqldf的name__class方法(注意双下划线指定要转换为的类:

sqldf("select dif as dif__numeric from DF", method = "name__class")

##   dif
## 1   1

答案 1 :(得分:1)

我实际上找到了答案。只需使用as.integer()将difftime变量转换为整数。我阅读了很多博客,我无法在任何地方找到答案,所以我发布答案以供将来参考