2016-07-26 46 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'说预计在未来某个时候会发生变化。 –

相关问题