Как дата с двузначными годами
Если я конвертирую дату 10.10.61
(ДД.ММ.ГГ) с as.Date(date, format="%d.%m.%y")
по какой-то причине он превращает его в 2061-10-10.
Есть ли элегантный способ исправить это, или мне нужно сделать это вручную, разрезав строку и добавив "19" впереди?
Я также попробовал пакет зоопарка, который выдает тот же (неправильный) результат.
4 ответа
x = format(as.Date("10.10.61", "%d.%m.%y"), "19%y-%m-%d")
x = as.Date(x)
x
class(x)
Обратите внимание, что один sub
нарежем строку и добавим год к 19, так что это не так обременительно:
as.Date(sub("(..)$", "19\\1", date), "%d.%m.%Y")
## [1] "1961-10-10"
chron Альтернативно, для пакета chron по умолчанию установлено значение 30, поэтому он будет использовать 1961 по умолчанию:
library(chron)
as.Date(dates(date, format = "d.m.y"))
## [1] "1961-10-10"
В хрононе правило расширения года определяется "chron.year.expand"
опция, которая по умолчанию установлена на year.expand
функция и функция по умолчанию cut.off
См. этот пост SO для получения дополнительной информации: Добавьте правильный век к датам с указанием года "Год без века", %y
Если все ваши даты в 1900-х годах, то вы можете использовать это решение:
library(magrittr)
your_date = '10.10.61'
as.Date(your_date,format="%d.%m.%y") %>% format("19%y%m%d") %>% as.Date("%Y%m%d")
Если все ваши даты находятся в прошлом, но некоторые из них относятся к 2000-м годам (например, даты рождения), вы можете использовать это решение:
origDates = c('10.10.61','10.10.01')
badDates = as.Date(origDates,'%d.%m.%y')
badDates
## [1] "2061-10-10" "2001-10-10"
goodDates = ifelse(badDates > Sys.Date(),
format(badDates,'19%y-%m-%d'),
format(badDates,'%Y-%m-%d'))
newDates = as.Date(goodDates)
newDates
## [1] "1961-10-10" "2001-10-10"