Подтвердить что ты не робот

Добавьте правильный век к датам с годом, представленным как "Год без века",% 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.

4b9b3361

Ответ 1

1) chron. chron использует 30 по умолчанию, поэтому он преобразует их в первое преобразование в Date (так как chron не может читать эти виды дат), переформатируя символ с двухзначными годами в формат, который chron может понять и, наконец, вернуться к дате.

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 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) Только дата. Вот альтернатива, которая не использует chron. Возможно, вы захотите заменить "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)))

EDIT: добавлено решение только для даты.