Как разделить дату и время на два столбца - PullRequest
1 голос
/ 05 мая 2019

Мне нужно разделить 10/4/2018 19:21 и попробовал

AccidentsMp$Hours <- format(as.POSIXct(AccidentsMp$Job.Date, "%Y-%m-%d %H:%M:%S", tz = ""), format = "%H:%M")

AccidentsMp$Dates <- format(as.Date(AccidentsMp$Job.Date,"%Y-%m-%d"), format = "%d/%m/%Y")

Как я могу разделить вышеуказанную дату и время на два столбца? Данные относятся к классу factor сейчас.

Ответы [ 3 ]

1 голос
/ 05 мая 2019

Если нужно сделать это трудным путем:

text<-"10/4/2018 19:21"
res<-strsplit(text," ")
df$Date<-res[[1]][1]
df$Time<-res[[1]][2]
#install.packages("lubridate")
df$Date<-lubridate::mdy(df$Date)
df$Time<-lubridate::hm(df$Time)

Вы можете получить время и дату без использования каких-либо пакетов:

df$Time<-format(strptime(res[[1]][2],"%H:%M",tz=""),"%H:%M") #cleaner output
df$Date<- as.Date(res[[1]][1],"%m/%d/%Y")

Результат с помощью lubridate:

 month item sales       Date       Time
1     1    A    10 2018-10-04 19H 21M 0S
2     2    b    20 2018-10-04 19H 21M 0S
3     2    c     5 2018-10-04 19H 21M 0S
4     3    a     3 2018-10-04 19H 21M 0S

Данные

df<-structure(list(month = c(1, 2, 2, 3), item = structure(c(2L, 
3L, 4L, 1L), .Label = c("a", "A", "b", "c"), class = "factor"), 
    Time = new("Period", .Data = c(0, 0, 0, 0), year = c(0, 0, 
    0, 0), month = c(0, 0, 0, 0), day = c(0, 0, 0, 0), hour = c(19, 
    19, 19, 19), minute = c(21, 21, 21, 21))), class = "data.frame", row.names = c(NA, 
-4L))
1 голос
/ 05 мая 2019

Вот вариант с tidyverse

library(tidyverse)
library(lubridate)
df %>% 
  mutate(Job.Date = dmy_hm(Job.Date)) %>% 
  separate(Job.Date, into = c('date', 'time'), sep=' ', remove = FALSE)
#           Job.Date       date     time
#1 2018-04-10 19:21:00 2018-04-10 19:21:00
#2 2018-04-10 19:22:00 2018-04-10 19:22:00
#3 2018-04-10 19:23:00 2018-04-10 19:23:00

Или используя base R

read.table(text = as.character(df$Job.Date), header = FALSE,
     col.names = c("date", "time"))

Данные

df <- structure(list(Job.Date = structure(1:3, .Label = c("10/4/2018 19:21", 
"10/4/2018 19:22", "10/4/2018 19:23"), class = "factor")), 
 class = "data.frame", row.names = c(NA, -3L))
1 голос
/ 05 мая 2019

Если ваши данные соответствуют тому же формату, как показано, мы можем сделать это следующим образом, используя только базовую R

df$datetime <- as.POSIXct(df$Job.Date, format = "%d/%m/%Y %H:%M")
transform(df, time = format(datetime, "%T"), date = format(datetime, "%d/%m/%Y"))

#        Job.Date            datetime     time       date
#1 10/4/2018 19:21 2018-04-10 19:21:00 19:21:00 10/04/2018
#2 10/4/2018 19:22 2018-04-10 19:22:00 19:22:00 10/04/2018
#3 10/4/2018 19:23 2018-04-10 19:23:00 19:23:00 10/04/2018

. Вы можете удалить столбец datetime позже, если не нужно.

данные

df <- data.frame(Job.Date = c("10/4/2018 19:21", "10/4/2018 19:22",
                              "10/4/2018 19:23"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...