2016-04-18 4 views
0

У меня есть два столбца в кадре данных, где мне нужно рассчитать разницу во времени. Данные являются локальными данными PD из открытых данных городов. Одна колонка нижеРазница в датах с использованием sqldf в R

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

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

Также TimeArrival как несколько отсутствующих значений, так как каждой отправке не нужны полицейские.

Я пытаюсь найти разницу, используя sqldf в R, но он говорит, что эту ошибку

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 

Любые помогают ребята?

+0

Нужны ли это сделать с помощью 'sqldf' –

+0

Может вы отправляете запрос, который вы используете? –

+0

всего $ TimeDispatched <- as.POSIXlt (strptime (всего $ TimeDispatch, format = '% m /% d /% y% H:% M:% S')) всего $ TimeArrived <- as.POSIXlt (strptime (total $ TimeArrive, format = '% m /% d /% y% H:% M: S')) всего $ diff <- difftime (всего $ TimeDispatched, total $ TimeArrived, units = c (авто)) q2 <- sqldf ('выберите avg (diff) как Avg_Arrival_time из общего числа, где diff не является нулевой группой от PoliceDistrict). Проблема в том, что мне нужно позже сгруппировать их с SQL и sqldx не очень хорошо с POSIXct date –

ответ

1

Я действительно нашел ответ. Просто преобразуйте переменную difftime в целое число, используя as.integer(). Я читал многочисленные блоги, и я не мог найти ответ нигде, поэтому я отправляю ответ для дальнейшего использования.

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", поэтому эвристика, назначающая классы, не будет пытаться ее преобразовать.

sqldf("select dif as dif2 from DF") 

## dif2 
## 1 1 

5) Используйте name__class метод sqldf (обратите внимание на двойное подчеркивание, чтобы указать класс для преобразования:

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

## dif 
## 1 1 
Смежные вопросы