Разница в датах с использованием sqldf в R

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

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

Любая помощь, ребята?


person Dinesh.hmn    schedule 18.04.2016    source источник
comment
Обязательно ли это делать с помощью sqldf?   -  person Kunal Puri    schedule 18.04.2016
comment
Не могли бы вы опубликовать запрос, который вы используете?   -  person Kunal Puri    schedule 18.04.2016
comment
total$TimeDispatched ‹- as.POSIXlt(strptime(total$TimeDispatch, format= '%m/%d/%y %H:%M:%S')) total$TimeArrived ‹- as.POSIXlt(strptime(total$ Время прибытия, формат = '%m/%d/%y %H:%M:S')) total$diff ‹- difftime(total$TimeDispatched, total$TimeArrived, unit = c(auto)) q2 ‹- sqldf( 'выберите avg (diff) как Avg_Arrival_time из общего количества, где diff не является нулевой группой по PoliceDistrict') Проблема в том, что мне нужно позже сгруппировать их с помощью SQL, а sqldx не подходит для даты POSIXct   -  person Dinesh.hmn    schedule 18.04.2016
comment
Вы также можете сгруппировать их без использования sqldf.   -  person Kunal Puri    schedule 18.04.2016
comment
Спасибо, Кунал, я действительно решил это. Это было на самом деле просто. После преобразования я просто использовал функцию as.integer, а затем использовал группу.   -  person Dinesh.hmn    schedule 18.04.2016


Ответы (2)


Из комментариев к вопросу проблема не в том, как рассчитать разницу между двумя временами, используя 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) Используйте метод name__class sqldf (обратите внимание на двойное подчеркивание, чтобы указать класс для преобразования:

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

##   dif
## 1   1
person G. Grothendieck    schedule 18.04.2016

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

person Dinesh.hmn    schedule 18.04.2016