R Помощь Конвертировать Дата Время - PullRequest
0 голосов
/ 17 июня 2019

Привет. У меня есть следующие столбцы в df, и я хочу преобразовать оба формата в одинаковый тип даты.Это сделано для того, чтобы я смог создать новый столбец Duration, для которого требуется 'End.Date.Time' - 'Start.Date.Time':

End.Date.Time    Start.Date.Time
1/5/2018 12:14   20171125 
1/5/2018 12:14   20171125 
1/5/2018 12:14   20171125 
30/5/2017 22:47  20170502
30/5/2017 22:47  20170502
30/5/2017 22:47  20170502

Я пытался

library(lubridate)
df %>% mutate(End.Date.Time = ymd_hms(End.Date.Time), Start.Date.Time = ymd_hms(Start.Date.Time))

out: All formats failed to parse. No formats found.

Все значения Start.Date.Time становятся NA.Как я могу решить это?

Ответы [ 3 ]

2 голосов
/ 17 июня 2019

Путь Base R будет

transform(df, 
   End.Date.Time  = as.POSIXct(End.Date.Time, format = "%d/%m/%Y %H:%M"), 
   Start.Date.Time = as.POSIXct(as.character(Start.Date.Time), format = "%Y%m%d"))

#        End.Date.Time Start.Date.Time
#1 2018-05-01 12:14:00      2017-11-25
#2 2018-05-01 12:14:00      2017-11-25
#3 2018-05-01 12:14:00      2017-11-25
#4 2017-05-30 22:47:00      2017-05-02
#5 2017-05-30 22:47:00      2017-05-02
#6 2017-05-30 22:47:00      2017-05-02

Или, если вы хотите, чтобы оба столбца были датами, вы могли бы сделать

transform(df, 
  End.Date.Time  = as.Date(as.POSIXct(End.Date.Time, format = "%d/%m/%Y %H:%M")), 
  Start.Date.Time = as.Date(as.character(Start.Date.Time), format = "%Y%m%d"))

С lubridate мы можем использоватьфункции dmy_hm и ymd для преобразования

library(dplyr)
library(lubridate)

df %>% 
   mutate(End.Date.Time = dmy_hm(End.Date.Time), 
          Start.Date.Time = as.POSIXct(ymd(Start.Date.Time)))

данные

df <- structure(list(End.Date.Time = structure(c(1L, 1L, 1L, 2L, 2L, 
2L), .Label = c("1/5/2018 12:14", "30/5/2017 22:47"), class = "factor"), 
Start.Date.Time = c(20171125L, 20171125L, 20171125L, 20170502L, 
20170502L, 20170502L)), class = "data.frame", row.names = c(NA, -6L))
1 голос
/ 17 июня 2019

Если вы хотите придерживаться lubridate, приведенный ниже код должен помочь.

df = structure(list(End.Date.Time = c("1/5/2018 12:14", "1/5/2018 12:14", 
                                  "1/5/2018 12:14", "30/5/2017 22:47", 
                                  "30/5/2017 22:47", "30/5/2017 22:47"), 
                Start.Date.Time = c(20171125L, 20171125L, 20171125L, 20170502L, 
                                    20170502L, 20170502L)), 
                .Names = c("End.Date.Time", "Start.Date.Time"), 
                row.names = c(NA, -6L), class = "data.frame")


df %>% 
  mutate(End.Date.Time = dmy_hm(End.Date.Time) %>% date, #dmy_hm outputs datetime. 
         Start.Date.Time = ymd(Start.Date.Time))

и как. Дата с базой также должна работать.

df %>% 
  mutate(End.Date.Time = dmy_hm(End.Date.Time) %>% as.Date, 
         Start.Date.Time = ymd(Start.Date.Time))
0 голосов
/ 17 июня 2019

Привет, ребята, большое спасибо за ваши решения.Я сделал следующее и получил то, что мне было нужно:

df$Duration <- as.Date((ymd_hms(df$End.Date.Time))) - (ymd(df$Start.Date.Time))
...