Рассчитать разницу между часами без учета даты - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть вектор с метками времени в формате:

"12:00:00"

это 24-часовой формат, и у меня нет даты, связанной с этими временными метками.Я хотел бы рассчитать разницу во времени между ними.

Так, чтобы разница между 12 и 11 = 1 и разница между 23 и 01 = 2.

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

Данные:

head(x3)
[1] "12:00:00" "18:00:00" "21:00:00" "06:00:00" "00:00:00" "09:00:00"

Как можно решить эту проблему?

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Мы предполагаем, что

  1. - это строки в формате чч: мм: сс, где чч - от 00 до 23 включительно
  2. следует использовать только чч
  3. выходные данные должны быть часами в виде числа
  4. вычитать вторые часы из первого
  5. , если первые часы меньше второго, добавьте 24 к # 4

Вышесказанное дает следующее для двух примеров в вопросе.Пакеты не используются.

Diff <- function(t1, t2) {
  h1 <- as.numeric(sub(":.*", "", t1))
  h2 <- as.numeric(sub(":.*", "", t2))
  h1 - h2 + 24 * (h1 < h2)
}

Diff("12:00:00", "11:00:00")
## [1] 1

Diff("1:00:00", "23:00:00")
## [1] 2

Если мы хотим вычислить разницу между v, показанным ниже, и "12:00:00", скажем, тогда:

v <- c("12:00:00", "18:00:00", "21:00:00", "06:00:00", "00:00:00", "09:00:00")
Diff(v, "12:00:00")
## [1]  0  6  9 18 12 21
0 голосов
/ 17 декабря 2018

Если вас интересует только абсолютная разница часов и формат отметки времени согласован, вы можете сделать

absDif <- abs(as.numeric(substr(test_time[2], 1, 2)) - as.numeric(substr(test_time[1], 1, 2)))

Если вам также нужны минуты, возможно, удобнее создать числовой столбец времениво-первых, например, как внутри цикла

numericTimestamps[i] <- as.numeric(substr(test_time[i], 1, 2) + 
       as.numeric(substr(test_time[i], 4, 5) / 60 + 
       as.numeric(substr(test_time[i], 7, 8) / 60 / 60

РЕДАКТИРОВАТЬ для учета измененного вопроса:

Если я вас правильно понял, вы ищете не абсолютную разницу, а простую разницу в часахучитывая дневную смену.В этом случае может быть проще перейти к объектам dateTime, как предлагается ниже.Если вы хотите придерживаться числовых значений, вам нужно учитывать сдвиг даты самостоятельно, например, добавив условие if:

absDif <- as.numeric(substr(test_time[2], 1, 2)) - as.numeric(substr(test_time[1], 1, 2))

# if the first is smaller than the second, there was most probably a shift in date
if(as.numeric(substr(test_time[2], 1, 2)) < as.numeric(substr(test_time[1], 1, 2))){

  # correct by 24 hours
  absDif <- as.numeric(substr(test_time[2], 1, 2)) - (as.numeric(substr(test_time[1], 1, 2)) + 24)
}
0 голосов
/ 17 декабря 2018

Вот подход, использующий lubridate и dplyr

library(dplyr)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

times <- data_frame(times = hms(c("12:00:00", "18:00:00", "21:00:00", "06:00:00", "00:00:00", "09:00:00")))

times %>% 
  mutate(difference =  hour(times) - lag(hour(times)))
#> # A tibble: 6 x 2
#>   times        difference
#>   <S4: Period>      <dbl>
#> 1 12H 0M 0S            NA
#> 2 18H 0M 0S             6
#> 3 21H 0M 0S             3
#> 4 6H 0M 0S            -15
#> 5 0S                   -6
#> 6 9H 0M 0S              9

Создан в 2018-12-17 пакетом Представить (v0.2.1)

0 голосов
/ 17 декабря 2018

Один из основных вариантов R будет состоять в том, чтобы сформировать временные даты, используя ваши данные, добавив произвольную дату.Затем используйте strptime и difftime, чтобы найти разницу в часах:

t1 <- "12:00:00"
t2 <- "10:15:00"
date <- "2018-01-01"

as.numeric(difftime(strptime(paste(date, t1), "%Y-%m-%d %H:%M:%S"),
                    strptime(paste(date, t2), "%Y-%m-%d %H:%M:%S")))

[1] 1.75
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...