如何处理日期时间对象中的模糊世纪?

时间:2016-07-26 02:14:32

标签: r datetime

我正在玩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以输入&#34; 60&#34;?处理模糊世纪的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

as.POSIXct的输入无法让"60"返回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’.

如果您想要"%Y"的不同行为,则需要在字符串前加上世纪并使用as.POSIXct格式。

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

如果两位数的某些日期在2000之后,您可以使用ifelse或类似的东西来预设不同的世纪。

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

答案 1 :(得分: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"