Вычисление разницы во времени в R
У меня есть данные с более чем 3 миллионами записей с start.time и end.time как две из переменных. Первые 10 обследований следующие:
start.date start.time end.date end.time
1 2012-07-13 15:01:32 2012-07-13 15:02:42
2 2012-07-05 18:26:31 2012-07-05 18:27:19
3 2012-07-14 20:23:21 2012-07-14 20:24:11
4 2012-07-29 16:09:54 2012-07-29 16:10:48
5 2012-07-21 14:58:32 2012-07-21 15:00:17
6 2012-07-04 15:36:31 2012-07-04 15:37:11
7 2012-07-22 18:28:31 2012-07-22 18:28:50
8 2012-07-09 21:08:42 2012-07-09 21:09:02
9 2012-07-05 09:44:52 2012-07-05 09:45:05
10 2012-07-02 18:50:47 2012-07-02 18:51:38
Мне нужно рассчитать разницу между start.time и end.time.
Я использовал следующий код:
mbehave11$diff.time <- difftime(mbehave11$end.time, mbehave11$start.time, units="secs")
Но я получаю эту ошибку:
Error in as.POSIXlt.character(x, tz, ...) :
character string is not in a standard unambiguous format
In addition: Warning messages:
1: In is.na.POSIXlt(strptime(xx, f <- "%Y-%m-%d %H:%M:%OS", tz = tz)) :
Reached total allocation of 1535Mb: see help(memory.size)
Ответы
Ответ 1
Вы должны превратить свои строки в объекты даты, прежде чем сможете выполнить арифметику даты и времени. Попробуйте следующее:
a) Чтение ваших данных:
R> dat <- read.table(textConnection("start.date start.time end.date end.time
2012-07-13 15:01:32 2012-07-13 15:02:42
2012-07-05 18:26:31 2012-07-05 18:27:19
2012-07-14 20:23:21 2012-07-14 20:24:11"), header=TRUE)
b) Работа над одним наблюдением:
R> strptime( paste(dat[,1], dat[,2]), "%Y-%m-%d %H:%M:%S")
[1] "2012-07-13 15:01:32" "2012-07-05 18:26:31" "2012-07-14 20:23:21"
c) Работа над множеством, преобразование в числовое:
R> as.numeric(difftime(strptime(paste(dat[,1],dat[,2]),"%Y-%m-%d %H:%M:%S"),
strptime(paste(dat[,3],dat[,4]),"%Y-%m-%d %H:%M:%S")))
[1] -70 -48 -50
R>
Ответ 2
Я думаю, что вы можете использовать пакет lubridate
у него есть метод с именем ymd_hms
Вы можете использовать это, чтобы получить время из строки: это намного быстрее для большого набора данных
library(lubridate)
dat <- read.table(textConnection("start.date start.time end.date end.time
2012-07-13 15:01:32 2012-07-13 15:02:42
2012-07-05 18:26:31 2012-07-05 18:27:19
2012-07-14 20:23:21 2012-07-14 20:24:11"), header=TRUE)
starttime = ymd_hms(paste(dat[,1], dat[,2]))
endtime = ymd_hms(paste(dat[,3], dat[,4]))
interval = difftime(endtime,starttime,units = "secs")