Невозможно преобразовать символ в Datetime - PullRequest
0 голосов
/ 01 ноября 2019

Это не дубликат. Я уже ссылался на эти сообщения 1 , 2 , 3

У меня есть датафрейм, как показано ниже:

t_df <- data.frame("SN" = c("AabcC123","ABC123","ABC123","MNO098","MNO098","MNO098"), 
                      "code" = c("ABC1111","DEF222","GHI133","","MNO1123","MNO567"), 
                      "d_time" = c("21/12/2012 12:12","30/06/2019 11:11","20/02/2027 10:10","22/11/2327 09:09:11","5/2/1927 08:08:12",""))
t_df <- data.frame(lapply(t_df, as.character), stringsAsFactors=FALSE)

Пока я читаю файл csv, все мои даты имеют тип character.

Поэтому, когда я пытаюсь отсортировать кадр данных, он работает только на основе первых символов.

Iхотел бы преобразовать это в Datetime формат.

Хотя я попробовал описанные ниже варианты, основанные на других постах, которые я связал выше, ничего не помогло. Возвращает NA

as_datetime(t_df$d_time, "%d/%m/%Y %H:%M:%S")  

as.POSIXct(t_df$d_time,format="%d/%m/%Y %H:%M:%S")

dmy_hms(t_df$d_time)

Можете ли вы помочь мне преобразовать тип данных в datetime?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Идея состоит в том, чтобы подсчитать двоеточия (:) и, если есть только 1, добавить секунды как :00, то есть

library(stringr) #for str_count()

t_df$d_time[t_df$d_time != ''] <- ifelse(str_count(t_df$d_time[t_df$d_time != ''], ':') < 2, 
                                               paste0(t_df$d_time[t_df$d_time != ''], ':00'), 
                                                               t_df$d_time[t_df$d_time != ''])

as.POSIXct(t_df$d_time, format = "%d/%m/%Y %H:%M:%S")
#[1] "2012-12-21 12:12:00 EET" "2019-06-30 11:11:00 +03" "2027-02-20 10:10:00 +03" "2327-11-22 09:09:11 +03" "1927-02-05 08:08:12 EET" NA
1 голос
/ 01 ноября 2019

Вы должны настроить формат в соответствии с форматом ваших данных, который равен %d/%m/%Y. Например, в первом ряду у вас есть 21/12/2012, что составляет day/month/year. В R сокращение для дня - %d сокращение для месяца - %m, а сокращение для четырехзначного года - %Y. Косые черты / между ними относятся к косым чертам в вашей строке.

Поэтому

t_df <- data.frame("SN" = c("AabcC123","ABC123","ABC123","MNO098","MNO098","MNO098"), 
                   "code" = c("ABC1111","DEF222","GHI133","","MNO1123","MNO567"), 
                   "d_time" = c("21/12/2012","30/06/2019","20/02/2027","22/11/2327","5/2/1927",""),
                   stringsAsFactors = FALSE)

t_df$d_time <- as.POSIXct(t_df$d_time, format = "%d/%m/%Y")

Обратите внимание, что большую часть времени при создании data.frame лучше использовать опциюstringsAsFactors = FALSE как и я.

...