2016-07-26 44 views
0

我在R中玩弄日期時間的東西,無法弄清楚如何改變時間原點來接受更老的日期。例如:如何在日期時間對象中處理不明確的世紀?

vals <- as.character(60:70) 
as.POSIXct(vals, origin="1900-01-01", format = "%y") 
# [1] "2060-07-25 EDT" "2061-07-25 EDT" "2062-07-25 EDT" "2063-07-25 EDT" 
# [5] "2064-07-25 EDT" "2065-07-25 EDT" "2066-07-25 EDT" "2067-07-25 EDT" 
# [9] "2068-07-25 EDT" "1969-07-25 EDT" "1970-07-25 EDT" 

是否有可能調整的起點,從而as.POSIXct將回到1960年的「60」的輸入?處理一個不明確的世紀的最佳方式是什麼?

回答

1

對於輸入"60",您無法使as.POSIXct返回1960。見?strptime

‘%y’ Year without century (00-99). On input, values 00 to 68 are 
     prefixed by 20 and 69 to 99 by 19 - that is the behaviour 
     specified by the 2004 and 2008 POSIX standards, but they do 
     also say ‘it is expected that in a future version the default 
     century inferred from a 2-digit year will change’. 

您需要的世紀,預先準備的字符串,如果你想與as.POSIXct不同的行爲使用"%Y"格式。

vals <- as.character(60:70) 
as.POSIXct(paste0("19",vals), format = "%Y") 

如果某些兩位數日期是2000年以後,你可以使用ifelse或類似前面加上一個不同的世紀東西。

newvals <- paste0(ifelse(vals < "20", "20", "19"), vals) 
+0

我讀過 - 我只是假設會有一種方法來改變默認行爲。 – dayne

+0

@dayne:通常沒有辦法破壞符合國際標準的行爲。 –

1

假設你可能想要一些比2000年多的年份,那麼對矢量預先加上19可能是不理想的。

在這種情況下,減去100年可能會更好。

library(lubridate) 
vals <- as.character(60:70) 
vals <- as.POSIXct(vals, origin="1900-01-01", format = "%y") 
vals[year(vals)>2059] <- vals[year(vals)>2059] - years(100) 
vals 

[1] "1960-07-25 CDT" "1961-07-25 CDT" "1962-07-25 CDT" 
[4] "1963-07-25 CDT" "1964-07-25 CDT" "1965-07-25 CDT" 
[7] "1966-07-25 CDT" "1967-07-25 CDT" "1968-07-25 CDT" 
[10] "1969-07-25 CDT" "1970-07-25 CDT" 
+0

聰明的黑客。我還沒有看過'lubridate'軟件包。 – dayne

+0

我們許多與Hadley學習的人都知道hadleyverse比base R好。'lubridate'是一個很好的例子。 – shayaa

+1

這隻有在POSIX標準保持不變的情況下才有效,但是'strptime'說預計在未來某個時候會發生變化。 –

相關問題