Вычитание двух столбцов, состоящих из даты и времени, в R - PullRequest
7 голосов
/ 21 февраля 2012

У меня проблема с вычитанием двух столбцов таблицы, состоящей из даты и времени в одной ячейке.

> TimeData

DEPARTURE_TIME      LAB_TIME
1/30/2010 4:18      1/30/2010 0:29
1/30/2010 4:18      1/30/2010 0:29
1/30/2010 6:49      1/30/2010 0:48
1/30/2010 6:49      1/30/2010 0:48
1/30/2010 9:42      1/30/2010 1:29
1/30/2010 9:42      1/30/2010 1:29
1/30/2010 7:25      1/30/2010 1:16

Мне нужно получить разницу между временем отправления и лабораторным временем в часах и минутах.

Нужно ли разделять время и дату или есть способ вычесть данные таким образом?

Я действительно ценю любую помощь.

1 Ответ

13 голосов
/ 21 февраля 2012

Попробуйте TimeData$DEPARTURE_TIME - TimeData$LAB_TIME?

Это зависит от того, являются ли ваши столбцы xxx_TIME строками или вы конвертировали их в дату-время.

Предположим, что это строки (они были прочитаны с использованием read.csv или чего-то подобного); затем, чтобы преобразовать их в объекты даты и времени, вы можете использовать as.POSIXct (см. ?as.POSIXct и strptime):

# convert the string columns to dates
TimeData$DEPARTURE_TIME <- as.POSIXct(TimeData$DEPARTURE_TIME,
                                      format='%m/%d/%Y %H:%M')
TimeData$LAB_TIME       <- as.POSIXct(TimeData$LAB_TIME,
                                      format='%m/%d/%Y %H:%M')

Обратите внимание на аргумент format: похоже, у вас в формате месяц / день / год часы: минуты (часы 25 часов). См. ?strptime для получения дополнительной информации о форматах даты.

Затем, чтобы вычислить разницу, вы можете сделать:

diffs <- TimeData$DEPARTURE_TIME - TimeData$LAB_TIME

, который выбирает подходящие вам единицы времени, ИЛИ для указания часов, которые вы можете использовать difftime (см. ?difftime):

# like saying DEPARTURE_TIME-LAB_TIME but more control over the output
diffs <- difftime(TimeData$DEPARTURE_TIME,TimeData$LAB_TIME,units="hours")

Полученный объект diffs выглядит так:

> diffs
Time differences in hours
[1] 3.816667 3.816667 6.016667 6.016667 8.216667 8.216667 6.150000
attr(,"tzone")
[1] ""

Чтобы извлечь только числовую часть, используйте as.numeric(diffs). Чтобы преобразовать это в вектор часов и вектор минут ... ну, 60 минут в секунду и т.д .:

# use as.numeric(diffs) to retrieve just the vector.
# let's convert to hours & minutes...
diffs.hours <- floor(as.numeric(diffs))
diffs.minutes <- (as.numeric(diffs)%%1 * 60)

Даю вам:

> diffs.hours
[1] 3 3 6 6 8 8 6
> diffs.minutes
[1] 49 49  1  1 13 13  9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...