2010-11-30 3 views
10

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

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

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

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

+0

Причина вы получаете инвалиду 0200 - это то, что длина символов дня отличается (две цифры за 15 октября, одна цифра за 9-октябрь), и ваш код замены строки не учитывает это. Во всяком случае, вы, вероятно, можете использовать as.Date или strptime непосредственно в формате agument, без дальнейшей обработки символов. – mdsumner 2010-11-30 04:21:06

ответ

24

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

Я бы предостерег от `strptime`, потому что он возвращает объект` POSIXlt`, который, как правило, дает новые пользователи, потому что они не понимают, что это список. Если вам нужно время, используйте `as.POSIXct`, но будьте осторожны, если ваши« даты »действительно являются факторами ... – 2010-11-30 04:44:30

+1

true, но так как R 2.11.0« length () теперь возвращает длину соответствующего абстрактного вектора временной привязки а не всегда 9 (длина основной структуры списка). (Желание PR # 14073 и PR # 10507.) «Поэтому я подумал, стоит ли это усложнять ситуацию. Вы можете просто как. POSIXct (strptime (x)) в любом случае. – mdsumner 2010-11-30 06:19:26

30

Самый простой способ заключается в использовании lubridate:

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

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

-1

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

Смежные вопросы