Преобразование символа в 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")