2014-11-04 4 views
1

У меня есть числовой вектор следующегоПреобразование числовых значений даты

aa <- c(1022011, 2022011, 13022011, 23022011) (this vector is just a sample, it is very long) 

Значения записываются таким образом, что первое значение день, то месяц, а затем год.

Что я делаю прямо сейчас

as.Date(as.character(aa), %d%m%Y") 

но

это вызывает проблемы (возвращающимся NA) в случае одиночных цифр числа дней. (т.е. 1022011, 2022011).

поэтому в основном

as.Date("1022011", "%d%m%Y") does not work 

но

as.Date("01022011", "%d%m%Y") (pasting '0' ahead of the number) works. 

Я хочу, чтобы избежать склеивание '0' в таких случаях. Есть ли другая (прямая) альтернатива для преобразования числовых значений в даты сразу?

+0

есть несколько примеров здесь могут оказаться полезными http://stackoverflow.com/questions/16301204/r-converting-date-and-time-fields-to-posixct-with- hhmmss-format –

+0

Я думаю, '130222011' - это опечатка? Кажется, там есть дополнительная цифра. – jazzurro

+0

да. Исправленный. Спасибо, что указали это. – user3664020

ответ

3

В зависимости от вашей платформы вы можете использовать sprintf, чтобы добавить нуль в начале. Кажется, что Mac в порядке с этим, но не Windows 7, учитывая обсуждение с OP.

aa <- c(1022011, 2022011, 13022011, 23022011) 

as.Date(sprintf("%08s", aa), format = "%d%m%Y") 

[1] "2011-02-01" "2011-02-02" "2011-02-13" "2011-02-23" 

UPDATE

@CathyG любезно отметил, что sprintf("%08i",aa) работает на Windows 7.

+0

Я получаю первые два как NA. 0 не вставлен. Если вы запускаете только 'sprintf («% 08s », aa), он просто добавляет пробел не равным нулю. – user3664020

+0

@ пользователь3664020 посмотрим. Я не понимаю это на своей машине. Дай мне проверить. – jazzurro

+0

Это странно.Когда я запускаю 'sprintf («% 08s », aa)' Я получаю вектор '" 1022011 "" 2022011 "" 13022011 "" 23022011 "' – user3664020

3

Вы можете использовать dmy в lubridate:

library(lubridate) 
aa <- c(1022011, 2022011, 13022011, 23022011) 
> dmy(aa) 
[1] "2011-02-01 UTC" "2011-02-02 UTC" "2011-02-13 UTC" "2011-02-23 UTC" 

и если вы не хотите часовой пояс просто оберните его в as.Date:

> as.Date(dmy(aa)) 
[1] "2011-02-01" "2011-02-02" "2011-02-13" "2011-02-23" 

Спасибо @Ben Bolker,

> as.Date(mdy(aa)) 
[1] "2011-01-02" "2011-02-02" "2012-01-02" "2011-01-02" 
+0

Это не работает в случае 'aa <- c (1022011, 2232011, 12232011, 2272011)' где формат mmddyyyy. Возврат неправильных значений. Не можем ли мы как-то указать формат в 'dmy'? – user3664020

+1

использовать 'mdy()' вместо? –

+0

yup. mdy работал. Спасибо всегда хорошо знать о новых функциях. – user3664020

1

Я знаю, что вы не хотите, чтобы добавить "0", но все же, в базе R, это работает:

as.Date(sapply(aa,function(x){ifelse(nchar(x)==8,x,paste("0",x,sep=""))}),format = "%d%m%Y") 
5

Он может быть перестроен с использованием sub, и в этом случае равнина as.Date без работы формата:

x <- c(1022011, 11022011) # test data 

pat <- "^(..?)(..)(....)$" 
as.Date(sub(pat, "\\3-\\2-\\1", x)) 

даяние:

[1] "2011-02-01" "2011-02-11" 
+0

+1 Очень хорошее решение регулярных выражений. – nrussell

+0

Действительно, это то, что нужно знать. +1 – jazzurro