Чтобы правильно рассчитать с учетом начала года, вам нужно разделить вашу запись на две части, а затем вы можете выполнить вычисление интервал , используя преимущества уже написанного вами кода, а затем выполните суммирование.
tabela.split <-
tabela %>%
rowwise() %>%
do(
{
my_row <- .
new_df <- data.frame(
Year = year(my_row$data_hora_chegada) : year(my_row$data_hora_saida)
) %>%
mutate(
data_hora_chegada = ISOdate(Year, 1, 1, 0, 0, 0),
data_hora_saida = ISOdate(Year+1, 1, 1, 0, 0, 0)
)
new_df[1, "data_hora_chegada"] <- my_row$data_hora_chegada
new_df[nrow(new_df), "data_hora_saida"] <- my_row$data_hora_saida
new_df
}
) %>%
ungroup()
print(tabela.split)
Этот код готов к любому интервалу, поэтому, если в этом интервале более двух лет, он сгенерирует столько записей, сколько необходимо для всех лет интервала span.
Выходные данные
Year data_hora_chegada data_hora_saida
* <int> <dttm> <dttm>
1 2018 2018-07-05 18:00:00 2018-07-06 16:00:00
2 2019 2019-05-05 20:00:00 2019-05-05 22:30:00
3 2019 2019-12-31 23:00:00 2020-01-01 00:00:00
4 2020 2020-01-01 00:00:00 2020-01-01 15:00:00
Теперь вы можете использовать group_by()
и summarize()
для получения итогов по годам.
tabela.split %>%
mutate(
intervalo = as.numeric(lubridate::interval(
data_hora_chegada,
data_hora_saida
))
) %>%
group_by(Year) %>%
summarise(Hours = round(sum(intervalo)/3600,1))
Выходные данные
Year Hours
<dbl> <dbl>
1 2018 22
2 2019 3.5
3 2020 15
Однако, чтобы разбить его на любую меру времени, как указано динамически, было бы очень сложной задачей.