Преобразовать символ в дату в R - PullRequest
24 голосов
/ 30 ноября 2010

Я относительно новичок в 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, я считаю, что существует очень простой способ заставить мой столбец указывать правильные даты и что я упускаю очень очевидное решение.

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

Ответы [ 3 ]

54 голосов
/ 30 ноября 2010

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

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

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

46 голосов
/ 30 ноября 2010

Возможно, вы слишком усложняете вещи, есть ли причина, по которой вам нужен пакет 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")

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

0 голосов
/ 14 ноября 2017

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

...