регулярное выражение - отрицание нулей в месяцах и днях R - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть много векторов дат с сайта USGS.Некоторые даты выглядят так: «1981-00-00» или вот так: «1981-01-00».Я хотел бы найти эти невозможные даты и просто поставить «01» везде, где у меня есть «00».Вот что я сделал:

date <- c("1981-01-23","1981-00-02","2000-01-00","1900-00-00","1999-12-31")
month_regex <- "0?[1-9]|1[0-2]"
day_regex <- "0?[1-9]|[12]\\d|30|31"
tmp_date <- as.character(date)
tmp_month <- substr(tmp_date,6,7)
if (!all(grepl(month_regex,tmp_month))){
  substr(tmp_date[!grepl(month_regex,tmp_month)],6,7) <- "01"
}
tmp_day <- substr(tmp_date,9,10)
if (!all(grepl("0?[1-9]|[12]\\d|30|31",tmp_day))){
  substr(tmp_date[!grepl("0?[1-9]|[12]\\d|30|31",tmp_day)],9,10) <- "01"
}
print(tmp_date)

Кажется, это работает, но я хочу знать, возможно ли это в одну или две строки с заменой.Я думал о чем-то вроде этого:

  grepl(".+[-](?!00).+[-](?!00).+",tmp_date,perl = TRUE)

Но не смог заставить это работать.

1 Ответ

0 голосов
/ 29 ноября 2018

Поскольку вы хотите заменить -00 везде, где он найден, должен работать относительно простой gsub("-00","-01",x):

date1 <- c("1981-01-23","1981-00-02","2000-01-00",
           "1900-00-00","1999-12-31")
date1.fix <- gsub("-00","-01",date1)
##[1] "1981-01-23" "1981-01-02" "2000-01-01" "1900-01-01" "1999-12-31"

Если это работает , а не для вас, или результатыне то, что вы хотели, вам придется отредактировать свой вопрос, чтобы уточнить / привести воспроизводимый пример того, что не работает ...

...