Сплит время

У меня есть 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")