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