在 R 中使用 sqldf 的日期差异

Difference in dates using sqldf in R

我在数据框中有两列需要计算时间差。数据是来自城市开放数据的本地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

有什么帮助吗?

我真的找到了答案。只需使用 as.integer() 将 difftime 变量转换为整数即可。我阅读了很多博客,但在任何地方都找不到答案,所以我发布答案以供将来参考

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

这里有一个独立的例子来说明:

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" class:

sqldf("select * from DF")

##   dif
## 1   1

4) 确保原始的 "difftime" 列在输出中被重命名,这样它就不能将它与原始的 "difftime" 列相关联,因此分配 classes 的试探法不会尝试转换它。

sqldf("select dif as dif2 from DF")

##   dif2
## 1    1

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

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

##   dif
## 1   1