Сплит время
У меня есть df с столбцом datetime (DD: MM: yyyy HH: mm: ss) с именем "Start", и я хотел бы разбить этот столбец на два имени "дата" и "время".
Теперь я пробовал следующее:
df$Date <- sapply(strsplit(as.character(df$Start), " "), "[", 1)
df$Time <- sapply(strsplit(as.character(df$Start), " "), "[", 2)
Это работает, однако, если я использую функцию str (df) (я сократил ее, чтобы вы могли в основном видеть переменные моей озабоченности).
'data.frame': 18363 obs. из 19 переменных:
$ Начало: Фактор с 67 уровнями "2013-09-01 08: 07: 41.000",..: 1 1 1 1 1 1 1 1 1 1...
$ Интервал: int 47259 47259 47259 47259 47259 47259 47259 47259 47259 47259...
$ DateTime: Factor w/18363 levels "2013-09-01 08: 07: 41.350",..: 1 2 3 4 5 6 7 8 9 10...
$ TimeSensor: № 158489 158489 158490 158490 158491...
Итак, теперь мне нужно только знать, как преобразовать время и дату из "факторов" в "время" и "дату".
Если кто-то знает решение, я был бы очень благодарен! Я noob относительно R, поэтому, пожалуйста, не сжигайте меня на землю.
Спасибо, миллион!
Ответы
Ответ 1
Извините за этот поздний ответ! В любом случае, я получил помощь от кого-то в университете, и он придумал следующую, очень простую настройку моего временного кода..:
df$Date <- as.Date(df$Start) #already got this one from the answers above
df$Time <- format(as.POSIXct(df$Start) ,format = "%H:%M:%S")
Это преобразует факторы в "дату" и "POSIXct", как бы я этого хотел.
Спасибо всем за помощь! Надеюсь, в будущем я смогу вернуть какую-то услугу, хотя я сомневаюсь, что это будет с программированием..!
Ответ 2
Как насчет
df$Date <- as.Date(df$Start)
df$Time <- format(df$Start,"%H:%M:%S")
Ответ 3
Возможно, вы захотите сделать что-то подобное, избегая использования цикла lapply
, который на самом деле не нужен (но это тоже не плохо!)...
# If we had this data...
df <- data.frame( Start = c( "13:11:2013 15:39" , "13:11:2013 16:15" , "13:11:2013 17:52" ) )
# We can directly make two columns from the split strings without
# using a loop by call 'do.call'..
new <- do.call( rbind , strsplit( as.character( df$Start ) , " " ) )
# [,1] [,2]
#[1,] "13:11:2013" "15:39"
#[2,] "13:11:2013" "16:15"
#[3,] "13:11:2013" "17:52"
# Cbind them to the original data liek so...
cbind( df , Date = new[,2] , Time = new[,1] )
# Start Date Time
#1 13:11:2013 15:39 15:39 13:11:2013
#2 13:11:2013 16:15 16:15 13:11:2013
#3 13:11:2013 17:52 17:52 13:11:2013
Ответ 4
Увидев формат столбца, я бы сказал, что вы можете использовать as.POSIXct для правильного форматирования своего столбца, а затем использовать format() для извлечения необходимых данных.
Это код, который я использую при расщеплении столбца DateTime,
df$Time <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%H:%M:%S")
df$Date <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%Y:%m:%d")