Добавьте правильный век к датам с указанием года "Год без века", %y
У меня есть файл с днями рождения в %d%b%y
формат. Некоторые например
# "01DEC71" "01AUG54" "01APR81" "01MAY81" "01SEP83" "01FEB59"
Я пытался переформатировать дату как
o108$fmtbirth <- format(as.Date(o108$birth, "%d%b%y"), "%Y/%m/%d")
и это результат
# "1971/12/01" "2054/08/01" "1981/04/01" "1981/05/01" "1983/09/01" "2059/02/01"
Это дни рождения, и я вижу 2054. На этой странице я вижу, что значения года между 00 и 68 кодируются как 20 для столетия. Есть ли способ переключить это, в моем случае я хочу, чтобы только от 00 до 12 было закодировано как 20.
3 ответа
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)))
РЕДАКТИРОВАТЬ: добавлено Дата только решение.
Смотрите ответ из связанной темы:
format(as.Date("65-05-14", "%y-%m-%d"), "19%y-%m-%d")
o108$fmtbirth <- format(as.Date(o108$birth, "%d%b%y"), "%Y/%m/%d")
o108$fmtbirth <- as.Date(ifelse(o108$fmtbirth > Sys.Date(),
format(o108$fmtbirth, "19%y-%m-%d"),
format(o108$fmtbirth)))