Преобразование символа в Date в R

Я относительно новичок в R, но это первый раз, когда мне приходилось иметь дело с преобразованиями даты. Я прочитал свои данные из CSV (используя read.table()), но я выделил данные, чтобы выделить мою проблему. При чтении в R поле Date является символом.

Просто, большинство моих дат правильны, за исключением нескольких экземпляров. Следующий пример, надеюсь, покажет вам, что происходит.

# my attempt to coerce the date -- uses the stringr package
prods.all$Date2 <- as.Date(str_sub(prods.all$Date, 1, 
                str_locate(prods.all$Date, " ")[1]-1), 
                "%m/%d/%Y")

# grab two rows to highlight my issue
temp <- prods.all[c(1925:1926), c(1,8)]

> temp
                   Date      Date2
1925  10/9/2009 0:00:00 2009-10-09
1926 10/15/2009 0:00:00 0200-10-15

Как вы можете видеть, год некоторых из дат неточно. Образец, похоже, возникает, когда день имеет двойную цифру.

Я просмотрел несколько книг и попытался Google лучше, но все, кажется, предполагает, что мои данные не корректно отформатированы на входе.

Учитывая, насколько силен R, я считаю, что есть очень простой способ заставить мой столбец быть действительными датами и что я игнорирую очень очевидное решение.

Любая помощь, которую вы можете предоставить, будет с благодарностью.

Ответ 1

Вы можете быть слишком сложными, есть ли причина, по которой вам нужен пакет stringr?

 df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00"))
 as.Date(df$Date, "%m/%d/%Y %H:%M:%S")

[1] "2009-10-09" "2009-10-15"

В общем случае, и если вам нужен компонент времени, используйте strptime:

strptime(df$Date, "%m/%d/%Y %H:%M:%S")

Я предполагаю, на что могут повлиять ваши фактические данные из частичных результатов, которые вы даете.

Ответ 2

Самый простой способ - использовать lubridate:

library(lubridate)
prods.all$Date2 <- mdy(prods.all$Date2)

Эта функция автоматически возвращает объекты класса POSIXct и будет работать с любыми факторами или символами.

Ответ 3

Я не могу понять, как преобразовать мою символьную переменную в правильный формат времени. Я буквально перепробовал все возможные функции, предложенные здесь и в других местах. Может кто-нибудь, пожалуйста, посмотрите на мой код и скажите, что, черт возьми, с ним не так. Так, например, мой оригинальный формат - 24.07.1970 (месяц/день/год). Затем я использовал библиотеку lubridate и ввел этот код:

total.employees $ agency.hire.date.2 <- mdy (total.employees $ agency.hire.date.2)

где total.employees = имя dataframe agency.hire.date.2 = моя переменная в символьном формате

Результат действительно является переменной в формате даты, однако теперь это: год/месяц/день

Может кто-нибудь помочь, пожалуйста?

Ответ 4

library(lubridate) если ваш формат даты похож на этот '04/24/2017 05: 35: 00 ', то измените его, как показано ниже prods.all$Date2<-gsub("/","-",prods.all$Date2)  затем измените формат даты parse_date_time(prods.all$Date2, orders="mdy hms")