Суммирование значений POSIXct POSIXt из столбца

У меня есть один фрейм данных с более чем 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:35 или 01:33?

Edward 28.06.2024 04:18

Привет, сейчас 01:33, извини

Érika Soares Coelho 28.06.2024 14:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Один из способов — преобразовать строки времени в объект 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

Érika Soares Coelho 28.06.2024 02:12
Ответ принят как подходящий
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(): ! Некоторые строки не удалось проанализировать

Érika Soares Coelho 28.06.2024 02:07

@ÉrikaSoaresCoelho Не видя больше ваших данных, я предполагаю, что у вас есть строки не в формате HH:MM.

LMc 28.06.2024 02:15

Как я могу это проверить? Если это не формат HH:MM? имеется более 1000 строк, значение — as.character

Érika Soares Coelho 28.06.2024 02:17
which(!grepl("\\d{2}:\\d{2}", df$duracao)) вернет индексы строк, которые не соответствуют шаблону HH:MM.
LMc 28.06.2024 02:19

Да, я нашел эти значения -1:-20, -1:-00 и -1:-11, должно быть 1:20, 1:00 и 1:11, как мне это изменить, пожалуйста?

Érika Soares Coelho 28.06.2024 02:32

@ÉrikaSoaresCoelho Пожалуйста, обновите свое сообщение, указав эти недопустимые значения, и я отредактирую свой ответ.

LMc 28.06.2024 02:49

ЛМк, готово! Я обновил!

Érika Soares Coelho 28.06.2024 14:23

@ÉrikaSoaresCoelho Я добавил команду gsub(). Поскольку ваши значения являются символьными, вы можете просто использовать gsub(), чтобы удалить -, если они существуют в ваших данных.

LMc 28.06.2024 15:06

Привет, 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))) выглядит с результатом лучше

Érika Soares Coelho 30.06.2024 00:20

Извините за ежедневный LMc, сейчас я работаю на борту судна и у меня не было интернета.

Érika Soares Coelho 30.06.2024 00:35

@ÉrikaSoaresCoelho Да, есть еще функция day(). Просто извлеките информацию о дне, умножьте ее на 24, чтобы преобразовать ее в часы. Возьмите эту сумму и добавьте ее к выходным данным hour(), а затем вы можете использовать Paste0, чтобы соединить ЧЧ с минутами с помощью :. Я показал это на примере трубопроводной цепи. Примечание. Использование paste0 для получения его в этом формате приведет к преобразованию его в символьный объект, поэтому типичная арифметика времени и извлечение значений будут невозможны.

LMc 01.07.2024 17:13

Другие вопросы по теме