Ошибка в as.POSIXct.numeric (time1, tz = tz): должен быть указан ‘origin’

#r #string #time #diff #lubridate

#r #строка #время #разница #lubridate

Вопрос:

Я добавляю ежедневные часы / минуты (1:00,2:00,…, 13:30,…, 22:30, 24:10) для столбца строки расписания df для начального и конечного часа, после этого я хотел бы использовать разницу в часах между ними.

Вот моя попытка:

 # intial string example #

df[1, "schedule"] 

 // console output//
"14:00H ÀS 22:18H - 1H DE DESCANSO"

## setting hour and minutes format ##
initial_hour <- hm(
                    as.character(
                    factor(
                    substr(
                    df$schedule, 
                    start = 1,
                    stop  = 5)
                    )))

final_hour <-   hm(
                    as.character(
                    factor(
                    substr(
                    df$schedule,
                     start = 11,
                     stop =  15))))

# hour difference ##
difftime(final_hour, initial_hour, tz = Sys.timezone(location = TRUE) , units = "hours")

// console output //

Error in as.POSIXct.numeric(time1, tz = tz) : 'origin' must be supplied

  

Можно ли установить «origin» внутри функции аргумента?

Комментарии:

1. Не могли бы вы добавить вывод из dput (head (df, 5))

Ответ №1:

Как вы, кажется, используете lubridate , вы могли бы просто вычесть периоды без difftime :

 h1 <- lubridate::hm('24:10')
h2 <- lubridate::hm('23:05')

h1-h2

#> [1] "1H 5M 0S"
  

Создано 2020-09-25 пакетом reprex (версия 0.3.0)

Ответ №2:

Помещаем его в фрейм данных и используем dplyr и lubridate

 library(dplyr)
library(lubridate)

df %>%
   mutate(time_difference =
             hm(
                substr(schedule, 
                       start = 11,
                       stop  = 15)
             ) - 
             hm(
                substr(schedule, 
                       start = 1,
                       stop  = 5)
             ))

#> Note: method with signature 'Period#ANY' chosen for function '-',
#>  target signature 'Period#Period'.
#>  "ANY#Period" would also be valid

#>                            schedule time_difference
#> 1 14:00H ÀS 22:18H - 1H DE DESCANSO       8H 18M 0S
#> 2 18:00H ÀS 16:18H - 1H DE DESCANSO      -2H 18M 0S
  

Ваша запись плюс еще одна для данных

 df <- data.frame(
   schedule = c("14:00H ÀS 22:18H - 1H DE DESCANSO",
                "18:00H ÀS 16:18H - 1H DE DESCANSO")
)