Извлечение времени из середины строки в R при изменении строки c

У меня есть набор данных, содержащий данные о тренировках для нескольких спортсменов в разные дни/время. Один столбец содержит дату и время начала сеанса. Я хочу только сохранить время начала в этом столбце, то есть я хочу удалить «2020/01/05» и «UTC». Как удалить все до и после времени (есть 4 миллиона строк с разными датами/временем).

 start.time
1 2020/01/05 21:30:04 UTC 
2 2020/01/05 21:30:04 UTC 
3 2020/01/05 21:30:04 UTC 
4 2020/01/05 21:30:04 UTC 
5 2020/01/05 21:30:04 UTC 
6 2020/01/05 21:30:04 UTC 

Извините, наверное, где-то уже был ответ.

Спасибо


person wattss    schedule 27.03.2020    source источник


Ответы (2)


Несколько способов сделать это:

1) Использование регулярного выражения

df$time <- sub('.*\\s+(.*) UTC', '\\1', df$start.time)
df
#               start.time     time
#1 2020/01/05 21:30:04 UTC 21:30:04
#2 2020/01/05 21:30:04 UTC 21:30:04
#3 2020/01/05 21:30:04 UTC 21:30:04
#4 2020/01/05 21:30:04 UTC 21:30:04
#5 2020/01/05 21:30:04 UTC 21:30:04
#6 2020/01/05 21:30:04 UTC 21:30:04

Здесь мы фиксируем все, что находится между пробелами и "UTC". \\1 используется в качестве обратной ссылки для захвата извлеченного значения.


2) Преобразовать в POSIXct, а затем в format

Это можно сделать в базе R:

format(as.POSIXct(df$start.time, format = "%Y/%m/%d %T"), "%T")

Или используя lubridate

format(lubridate::ymd_hms(df$start.time), "%T")

данные

df <- structure(list(start.time = structure(c(1L, 1L, 1L, 1L, 1L, 1L
), .Label = "2020/01/05 21:30:04 UTC", class = "factor")), 
class = "data.frame", row.names = c(NA,-6L))
person Ronak Shah    schedule 27.03.2020
comment
Большое спасибо. Я использовал саб, и он работал отлично, но не могли бы вы объяснить, как он работает? то есть что означают введенные вами аргументы? (извините, я новичок в R) - person wattss; 27.03.2020
comment
@wattss Я обновил ответ, включив в него некоторые пояснения. - person Ronak Shah; 27.03.2020

Мы можем использовать anytime из anytime

library(anytime)
format(anytime(df$start.time), "%T")

Или с as.ITime

library(data.table)
as.ITime(df$start.time)
#[1] "21:30:04" "21:30:04" "21:30:04" "21:30:04" "21:30:04" "21:30:04"

данные

df <- structure(list(start.time = structure(c(1L, 1L, 1L, 1L, 1L, 1L
), .Label = "2020/01/05 21:30:04 UTC", class = "factor")), 
class = "data.frame", row.names = c(NA,-6L))
person akrun    schedule 27.03.2020