1) хрон .chron использует 30 по умолчанию, поэтому он преобразует их сначала в Date (поскольку chron не может прочитать такие даты), переформатируя его в символ с двузначными годами в формат, который chron может понять, и, наконец, обратно в Date.
library(chron)
xx <- c("01AUG11", "01AUG12", "01AUG13") # sample data
as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y")))
Это дает отсечение 30, но мы можем получить отсечение 13, используя опцию chron.year.expand
хрон:
library(chron)
options(chron.year.expand =
function (y, cut.off = 12, century = c(1900, 2000), ...) {
chron:::year.expand(y, cut.off = cut.off, century = century, ...)
}
)
и затем повторив исходное преобразование.Например, предполагая, что мы уже запустили этот оператор параметров, мы получили бы следующее с нашей xx
:
> as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y")))
[1] "2011-08-01" "2012-08-01" "1913-08-01"
2) Только дата .Вот альтернатива, которая не использует хрон.Вы можете заменить "2012-12-31"
на Sys.Date()
, если идея заключается в том, что в противном случае будущие даты действительно должны быть установлены на 100 лет назад:
d <- as.Date(xx, "%d%b%y")
as.Date(ifelse(d > "2012-12-31", format(d, "19%y-%m-%d"), format(d)))
РЕДАКТИРОВАТЬ: добавлено решение только для дат.