Преобразование временного диапазона в читаемый формат в R

#r #time

#r #время

Вопрос:

У меня возникли проблемы с преобразованием временного диапазона в столбце в читаемые данные для R. Как бы мне это преобразовать?

[1] «05:30P -08:00P» «07:00A -09:35A» «08:00A -10:30A» «08:55P -11:00P» «06:00P -06:30P»

 c("05:30P -08:00P", "07:00A -09:35A", "08:00A -10:30A", "08:55P -11:00P", 
"06:00P -06:30P")
  

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

1. Каков ожидаемый результат

Ответ №1:

Если мы хотим преобразовать в Datetime , можно разделить - на два столбца, а затем использовать as.POSIXct для выполнения преобразования

 library(stringr)
library(dplyr)
library(tidyr)
str_replace_all(str1, "([AP])", "\1M") %>% 
    tibble(str1 = .) %>% 
    separate(str1, into = c('start', 'end'), sep="\s*-") %>% 
    mutate(across(c(start, end), ~ as.POSIXct(., format = '%I:%M %p')))
# A tibble: 5 x 2
#  start               end                
#  <dttm>              <dttm>             
#1 2020-08-19 17:30:00 2020-08-19 20:00:00
#2 2020-08-19 07:00:00 2020-08-19 09:35:00
#3 2020-08-19 08:00:00 2020-08-19 10:30:00
#4 2020-08-19 20:55:00 2020-08-19 23:00:00
#5 2020-08-19 18:00:00 2020-08-19 18:30:00
  

Или использование lubridate

 library(lubridate)
str_replace_all(str1, "([AP])", "\1M") %>% 
     tibble(str1 = .) %>% 
     separate(str1, into = c('start', 'end'), sep="\s*-") %>% 
     mutate(across(c(start, end), ~ parse_date_time(., 'IMp')))
  

данные

 str1 <- c("05:30P -08:00P", "07:00A -09:35A", "08:00A -10:30A", "08:55P -11:00P", 
"06:00P -06:30P")
  

Ответ №2:

Попытка использования базового R strcapture для разделения временных меток на две части:

 dr <- c("05:30P -08:00P", "07:00A -09:35A", "08:00A -10:30A", "08:55P -11:00P", 
"06:00P -06:30P")

tms <- strcapture(r"((d :d [AP])[- ] (d :d [AP]))", dr, proto=list(start="",end=""))
tms[] <- lapply(tms, function(x) as.POSIXct(paste0(x, "M"), format="%I:%M%p", tz="UTC"))

#                start                 end
#1 2020-08-20 17:30:00 2020-08-20 20:00:00
#2 2020-08-20 07:00:00 2020-08-20 09:35:00
#3 2020-08-20 08:00:00 2020-08-20 10:30:00
#4 2020-08-20 20:55:00 2020-08-20 23:00:00
#5 2020-08-20 18:00:00 2020-08-20 18:30:00
  

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

1. strcapture мгновенно становится моей следующей функцией для «master» … спасибо @thelatemail

2. @r2evans — это недооцененный и действительно довольно удобный интерфейс для разделения на основе регулярных выражений.