r - Преодоление Y2K с as.Date
У меня есть список дат, которые я знаю, в прошлом, но в форме 28/MAY/13
, Ближайший способ сделать из них класс даты - это основной
dates <- as.Date(dates, format="%d/%b/%y")
который хорошо работает для всех дат, за исключением дат ранее 1968 года как ?as.Date
примечания к странице:
%y
Год без века (00–99). При вводе значения от 00 до 68 начинаются с префикса от 20, а от 69 до 99 - от 19 - это поведение, указанное в стандартах POSIX 2004 и 2008 годов, но они также говорят: "ожидается, что в будущей версии столетие по умолчанию будет выведено из год из двух цифр изменится ".
Excel делает для этого немного лучше, предполагая (в данном случае правильно), что все, когда год превышает 30, - это 1930 год и т. Д. Но я бы предпочел вернуться к 1914 году, если это возможно. Как я могу требовать, чтобы R интерпретировал все даты как в прошлом?
4 ответа
Что-то вроде этого:
Sys.setlocale("LC_TIME", "English")
dates <- as.Date(c("28/MAY/13","28/MAY/14"), format="%d/%b/%y")
#[1] "2013-05-28" "2014-05-28"
sub100 <- function(x) {
x <- as.POSIXlt(x)
x$year <- x$year-100
as.Date(x)
}
dates[dates > as.Date("2013-12-31")] <- sub100(dates[dates > as.Date("2013-12-31")])
#[1] "2013-05-28" "1914-05-28"
Небольшое уточнение ответа Роланда. Вместо того, чтобы иметь совершенно новый sub100
функция, просто используйте lubridate
"s year
функция.
library(lubridate)
dates <- as.Date(c("28/MAY/13","28/MAY/14"), format="%d/%b/%y")
after_cut_off <- dates > as.Date("2013-12-31")
dates[after_cut_off] <- dates[after_cut_off] - years(100) #this is the new bit
Может быть, я плотный, но почему бы не использовать %Y
(капитал)? Следующий ?strptime
Достоевский год с веком.
У меня есть одно решение, которое идеально подходит для меня.
Проблема Excel 2000 года: во всех версиях Excel 2 слова дата (месяц-год) или (пн-01) рассматривается как 1901, а не как 2001, когда конвертируется с помощью функции "=YEAR()". Обычно это происходит, когда мы загружаем старую базу данных, имеющую формат даты 2 слова в Excel.
Решение Excel 2000 года (не VBA): все (столбцы / строки) с таким форматом даты копируют его как текст, а затем используют небольшую формулу для преобразования его в надлежащий формат года (он хорошо работает с 2001 по 2099 год), но могут быть изменены после 3000 также. Я уверен, что до тех пор Microsoft придумает лучшее решение.
Y2K Формула Excel: C1="20" и ПРАВО (B1,2). A1: исходная дата B1: скопированная дата в текстовую форму C1: формула для преобразования ее в правильный год.