2015-03-16 3 views
0

я некоторые некорректные даты между хорошими отформатированных датами, глядя что-то вроде этого:Правильные неправильно отформатированные даты

df <- data.frame(col=c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05")) 

Как я могу преобразовать неправильный формат между существующими правильно отформатированные даты?

Я могу удалить первые тире, но для этого требуется удалить последние 3 символа -01 или -1. Так что скорректированные значения:

desired <- c("1.1.11","1.1.12","1.1.13","1.1.14","1.10.10","1.10.11","1.10.12","2010-03-31","2010-04-01","2010-04-05")) 

Что я задыхался это -01 части, так как, удаляя их, также удалить часть правильной отформатированных даты.

EDIT: Формат mm.dd.yy

+0

вы можете, пожалуйста, дайте нам знать, что это формат правильную дату. Я имею в виду dd.mm.yy или mm.dd.yy? – Chetan

ответ

1

Простое регулярное выражение будет решать подобные проблемы довольно хорошо:

> df <- c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05") 
> df 
[1] "--1.1.11-01" "--1.11.12-1" "--1.1.13-01" "--1.1.14-01" "--1.10.10-01" "-1.10.11-01" "---1.10.12-01" 
[8] "2010-03-31" "2010-04-01" "2010-04-05" 
> df <- sub(".*([0-9]{4}\\-[0-9]{2}\\-[0-9]{2}|[0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2}).*", "\\1", df) 
> df 
[1] "1.1.11"  "1.11.12" "1.1.13"  "1.1.14"  "1.10.10" "1.10.11" "1.10.12" "2010-03-31" "2010-04-01" 
[10] "2010-04-05" 

Обратите внимание, что я сделал это символ вектор вместо data.frame.

Решение само по себе соответствует только одному шаблону или другому шаблону, а затем отбрасывает остальное, заменяя его подшаблоном.

0

Я здесь заметить, что если префикс даты имеет запись как -1 или --1 только тогда существует нелегальный суффикс -01 т.е.. Вы можете сначала взять все значения в массиве. Итак, у вас будет массив «--1.1.11-01», «1.11.12-1», «1.1.13-01», «1.1.14-01», «- -1.10.10-01 "," - 1.10.11-01 "

Теперь вы можете проверить префикс, если он равен -1 или -1. если существует такая вещь, вы можете пометить ее, чтобы удалить суффикс -01. Согласно приведенному выше шаблону ввода, я чувствую, что вышеупомянутая стратегия будет работать.

Пожалуйста, дайте мне знать, если стратегия работает

3

Просто удалите все символы, отличные от слов, присутствующие в начале, или -01 или -1, присутствующие в конце, которому не предшествовало - + две цифры.

> x <- c("--1.1.11-01","--1.11.12-1","--1.1.13-01","--1.1.14-01","--1.10.10-01","-1.10.11-01","---1.10.12-01","2010-03-31","2010-04-01","2010-04-05") 
> gsub("^\\W+|(?<!-\\d{2})-0?1$", "", x, perl=T) 
[1] "1.1.11"  "1.11.12" "1.1.13"  "1.1.14"  "1.10.10" 
[6] "1.10.11" "1.10.12" "2010-03-31" "2010-04-01" "2010-04-05" 
+0

Прекрасно работает. Тем не менее, я принимаю решение @LauriK на основании правильного ответа на вопрос. Спасибо. – Maximilian

4

Вот довольно простое решение с использованием sub ...

sub('^-+([^-]+).+', '\\1', df$col) 
# [1] "1.1.11"  "1.11.12" "1.1.13"  "1.1.14"  "1.10.10" 
# [6] "1.10.11" "1.10.12" "2010-03-31" "2010-04-01" "2010-04-05" 
+1

Спасибо, мне очень нравится ваше решение, его простое, и я это понимаю :) – Maximilian

+1

@Maximilian, Добро пожаловать. – hwnd

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