Добавление продолжительности в HMS - PullRequest
1 голос
/ 07 февраля 2020

Мои извинения, если это повторный вопрос. У меня нет опыта работы с данными отметок времени в R.

У меня есть набор данных, который содержит данные продолжительности в формате HMS. Я хочу найти общую сумму этих значений.

library(lubridate)
name <- c("one", "one", "two", "two") 
duration <- lubridate::hms("38H 3M 24S", "6H 50M 58S", "31M 54S", "8H 13M 51S") 
data <- data.frame(name , duration, stringsAsFactors=FALSE)

Если я добавляю элементы напрямую, я получаю что-то, что не учитывает перенос времени на 60.

d1 <- data$duration[1] + data$duration[2]
d1

Возвращает «44H 53M 82S» - 82 секунды должно быть 1M 22S

Подобные проблемы с функцией суммы

d2 <- sum(data$duration)
d2

, это возвращает 82.

Я смотрю вниз по пути преобразования hms в секунды, суммируя те значения и преобразования обратно в HMS, и я подумал, конечно, кто-то должен был добавить HMS вместе раньше?

Моя конечная цель - сделать что-то подобное

d4 <- data %>%
   group_by(name) %>%
   summarise(totalTime = sum(duration)) 

В результате получается фрейм данных с

name | продолжительность

один | "45ч 22м 22с"

два | «8 ч. 45 м. 45 с.»

Заранее благодарим за комментарии.

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Я думаю, что вы ищете это:

d1 <- as.period(seconds(data$duration[1]) + seconds(data$duration[2]), unit = "hours")
d1
0 голосов
/ 12 февраля 2020

ОК, здесь происходит какая-то странность, но у меня есть кое-что, что сработает для меня.

Отработка предложения novica

Я реализовал это

d4 <- data %>%
  group_by(name) %>%
  dplyr::summarise(totalTime = as.period(seconds(sum(as.numeric(duration1))), unit = "hours"))

Вот странная часть. Это возвращает ожидаемое значение в первой группе и неправильное значение во второй группе.

имя | totalTime

один | 44H 54M 22S

два | 45S

Я попытался устранить неполадку безуспешно, поэтому я пошел дальше и в итоге получил это не очень элегантное решение, которое работает.

d4 <- data %>%
  group_by(name) %>%
  mutate(duration2 = as.numeric(duration1)) %>%  # as.numeric converts hms to seconds
  dplyr::summarise(timeInHours = sum(duration2)*0.0002777777784,
                   hours = floor(`timeInHours`),
                   minutes1 = (timeInHours - hours)*60, 
                   minutes = floor(minutes1),
                   seconds = round((minutes1-minutes) *60, digits = 0),
                   duration = paste0(hours, "H ", minutes, "M ", seconds, "S"),
                   hms = hms(duration))

После выбора интересующих вас столбцов вы можете получить имя | продолжительность

один | 44H 54M 22S

два | 8H 45M 45S

По сути, здесь применяется математика для преобразования секунд в часы, а затем преобразования остатка в минуты и напоминания в секунду. Что похоже на окольный способ добавления значений HMS

Мне не нравится это решение, но я хотел бы придерживаться структуры dplyr, поэтому я собираюсь пока остановиться на ней.

Если я придумаю что-то новое, я передам это.

...