У меня есть один фрейм данных с более чем 1000 строками и один столбец duracao, в котором я хочу суммировать имеющиеся там значения HH:MM, а также получить значение HH:MM.
df <- data.frame(duracao = c("00:29", "00:26", "00:38"))
#The sum should be 01:33
Сначала я попробовал:
class(df$duracao)
>character
df$duracao<-as.numeric(df$duracao)
df <- df %>%
mutate(duracao = seconds_to_period(duracao * 86400))
df <- df %>% #aqui
mutate(duracao = sprintf("%02d:%02d", hour(duracao), minute(duracao)))
total_duracao <- sum(df$duracao)
Затем вторая попытка:
df$duracao <- as.POSIXct(df$duracao, format = "%H:%M", tz = "UTC")
df <- df %>%
mutate(duracao_sec = as.numeric(duracao - as.POSIXct("1970-01-01", tz = "UTC")))
total_seconds <- sum(df$duracao_sec)
total_hours <- total_seconds %/% 3600
total_minutes <- (total_seconds %% 3600) %/% 60
total_duracao <- sprintf("%02d:%02d", total_hours, total_minutes)
print(total_duracao)
Обновлять
Я нашел эти странные значения в столбце
I ran this code
which(!grepl("\\d{2}:\\d{2}", df$duracao))
And the values were:
-1:-20 , -1:-00 and -1:-11
должно быть 1:20, 1:00 и 1:11, как это изменить, пожалуйста?
Привет, сейчас 01:33, извини





Один из способов — преобразовать строки времени в объект POSIXct, а затем подставить начало дня, чтобы получить разницу во времени.
df <- data.frame(duracao = c("00:29", "00:26", "00:38"))
#calculate the time difference from the time to the start of the day
Minutes <- as.difftime(df$duracao, "%H:%M", units = "mins")
print(sum(Minutes))
#Time difference of 93 mins
Mins_int <- as.integer(sum(Minutes))
paste0(Mins_int%/% 60, ":", Mins_int%% 60)
#[1] "1:33"
Привет, Dave2e, я попробовал этот код, но результат > print(sum(Minutes)) Time difference of NA mins
library(dplyr)
library(lubridate)
df |>
mutate(duracao = gsub("-", "", duracao, fixed = TRUE),
period = as.duration(hm(duracao))) |>
summarize(period = seconds_to_period(sum(period)),
hh_mm = paste0(sum(day(period * 24) + hour(period)), ":", minute(period)))
# period hh_mm
# 1 1H 33M 0S 1:33
Если вам не нужны значения во фрейме данных, вы можете просто использовать эту цепочку каналов (и игнорировать оператор library(dplyr)):
library(lubridate)
df$duracao |>
gsub("-", "", x = _, fixed = TRUE) |>
hm() |>
as.duration() |>
sum() |>
seconds_to_period()
Обратите внимание, что это возвращает объект Period. Это позволяет легко извлекать компоненты, если вам нужно:
total_duracao <- df$duracao |>
gsub("-", "", x = _, fixed = TRUE) |>
hm() |>
as.duration() |>
sum() |>
seconds_to_period()
hour(total_duracao)
# [1] 1
minute(total_duracao)
# [1] 33
second(total_duracao)
# [1] 0
Привет, LMc, я хочу увидеть результат в HH:MM, который ты сделал с символом duracao в качестве символа?, и я попробовал первый код, но в результате получилось: # Тиббл: 1 × 1 точка <Период> 1 НП Предупреждающее сообщение: Есть было 1 предупреждение в mutate(). ℹ В аргументе: period = as.duration(hm(duracao)). Вызвано предупреждением в .parse_hms(): ! Некоторые строки не удалось проанализировать
@ÉrikaSoaresCoelho Не видя больше ваших данных, я предполагаю, что у вас есть строки не в формате HH:MM.
Как я могу это проверить? Если это не формат HH:MM? имеется более 1000 строк, значение — as.character
which(!grepl("\\d{2}:\\d{2}", df$duracao)) вернет индексы строк, которые не соответствуют шаблону HH:MM.
Да, я нашел эти значения -1:-20, -1:-00 и -1:-11, должно быть 1:20, 1:00 и 1:11, как мне это изменить, пожалуйста?
@ÉrikaSoaresCoelho Пожалуйста, обновите свое сообщение, указав эти недопустимые значения, и я отредактирую свой ответ.
ЛМк, готово! Я обновил!
@ÉrikaSoaresCoelho Я добавил команду gsub(). Поскольку ваши значения являются символьными, вы можете просто использовать gsub(), чтобы удалить -, если они существуют в ваших данных.
Привет, LMc, код сработал, но, поскольку у меня много данных, в моем R первая часть кода отображается "49d 12H 36M 0S", а вторая часть кода — > hour(total_duracao) [1] 12 > minute(total_duracao) [1] 36 > second(total_duracao) [1] 0. В результате скрывается сумма усилий. Есть ли способ показать результат в формате ЧЧ:ММ? Я имею в виду, мне нужен результат в формате ЧЧ:ММ, можно ли преобразовать дни (все данные) в ЧЧ:ММ? И код df |> mutate(period = as.duration(hm(duracao))) |> summarize(period = seconds_to_period(sum(period))) выглядит с результатом лучше
Извините за ежедневный LMc, сейчас я работаю на борту судна и у меня не было интернета.
@ÉrikaSoaresCoelho Да, есть еще функция day(). Просто извлеките информацию о дне, умножьте ее на 24, чтобы преобразовать ее в часы. Возьмите эту сумму и добавьте ее к выходным данным hour(), а затем вы можете использовать Paste0, чтобы соединить ЧЧ с минутами с помощью :. Я показал это на примере трубопроводной цепи. Примечание. Использование paste0 для получения его в этом формате приведет к преобразованию его в символьный объект, поэтому типичная арифметика времени и извлечение значений будут невозможны.
Должна ли сумма быть
01:35или01:33?