2014-11-04 100 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 – 2014-11-04 12:31:49

+0

我猜'130222011'是一個錯字?似乎那裏有一個額外的數字。 – jazzurro 2014-11-04 12:35:41

+0

是的。糾正。感謝您指出。 – user3664020 2014-11-04 12:37:54

回答

3

根據您的平臺,您可以使用sprintf以便在開頭添加零。看起來Mac可以用這個,但是與OP討論的不是Windows 7。

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

我得到前兩名作爲助教。 0沒有被粘貼。如果你只運行'sprintf(「%08s」,aa)',它只會增加不爲零的空間。 – user3664020 2014-11-04 12:41:02

+0

@ user3664020我明白了。我不明白我的機器。讓我檢查一下。 – jazzurro 2014-11-04 12:44:23

+0

這很奇怪。當我運行sprintf(「%08s」,aa)''我得到一個向量''1022011「」2022011「」13022011「」23022011「' – user3664020 2014-11-04 12:45:30

3

您可以使用dmylubridate

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

對於格式爲mmddyyyy的'aa < - c(1022011,2232011,12232011,2272011)',這不起作用。返回錯誤的值。我們不能以某種方式在'dmy'中指定格式嗎? – user3664020 2014-11-04 12:57:49

+1

使用'mdy()'而不是? – 2014-11-04 12:58:59

+0

是。 mdy工作。非常感謝新功能。 – user3664020 2014-11-04 13:00:50

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 2014-11-04 13:06:02

+0

的確,這是一件值得了解的事情。 +1 – jazzurro 2014-11-04 13:07:31