2015-02-17 3 views
1

У меня есть столбец внутри фрейма данных, который содержит информацию о дате, которая хранится в нескольких формах, например.Преобразование нескольких форматов дат в столбце в одну форму

dob <- c("18/02/1983","36782","01/11,1999 11:55", 
     "Dead 12/12/2001","Alive 03/07/1985") 

Я хотел бы преобразовать все это в POSIXlt даты формата "%d/%m/%Y", без информации времени, и нет "Dead" или "Alive" предваряя их.

Все предыдущие решения подобных проблем включают только два возможных формата, которые я могу сказать, в то время как у меня есть больше, а также у меня есть проблема с преобразованием пятизначных дат формата чисел (которые, я думаю, являются числовыми датами с началом 1970 -01-01 из Excel). Я использую R-3.1.2. Любая помощь будет с благодарностью получена!

+2

Вам нужно понять исходные данные, потому что некоторые даты будут неоднозначными. Например, '' 01/11,1999 '' 1 ноября 1999 года; или 11 января 1999 года? –

+0

Ваши даты Excel могут быть проблемой (см. [Здесь] (http://stackoverflow.com/q/15686451/489704)) – jbaums

+0

Все они% d /% m /% Y, к счастью! – user4575913

ответ

1

Для этого нет простого или простого решения, вам придется хотя бы пройти через форматы вручную. Но сказать, что псевдокод для решения будет что-то вроде этого:

tmp <- grepl('[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]', dob)) 
formats[tmp] <- '%d/%m/%Y' 
tmp <- grepl(other format, dob) 
formats[tmp] <- 'other format' 
etc... 
dates <- strptime(dob, formats) 
4

lubridate гибок, насколько дата форматирования касается.

В зависимости от того, насколько ваш выбор из 5 дат вашего более крупного набора данных, вы можете разобрать их один раз, чтобы отфильтровать те, которые, как правило, в течение месяца-года. Затем, полагая, что остальное - это изворотливые даты Excel, проанализируйте их отдельно в соответствии с их надлежащим происхождением (слово предупреждения, это может depend on which OS файл Excel был создан).

library(lubridate) 
d <- parse_date_time(dob, c('%d%m%y', '%d%m%y %H%M')) 
d[is.na(d)] <- as.POSIXct(as.Date(as.numeric(dob[is.na(d)]), 
            origin = "1899-12-30")) 

d 

## [1] "1983-02-18 00:00:00 UTC" "2000-09-13 00:00:00 UTC" "1999-11-01 11:55:00 UTC" 
## [4] "2001-12-12 00:00:00 UTC" "1985-07-03 00:00:00 UTC" 

AFAIK вы не можете пропустить времени информацию от POSIXlt/POSIXct объектов, так что если вы хотите сделать, что вам может понадобиться:

as.Date(d) 

, который будет в формате %d-%m-%Y (в моей местности),

или

format(d, '%d/%m/%Y') 

, который будет character.

Смежные вопросы