纠正错误格式化的日期

时间:2015-03-16 13:53:01

标签: regex r date

我在格式良好的日期之间有一些不正确的日期,看起来像这样:

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部分,因为通过删除这些部分,也会删除部分正确的格式化日期。

编辑:格式为mm.dd.yy

4 个答案:

答案 0 :(得分: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 :(得分: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"

答案 2 :(得分: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。

解决方案本身只是匹配一个模式或另一个模式,然后通过用子模式替换它来删除其余模式。

答案 3 :(得分: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。 根据上面的输入模式,我觉得上述策略可行。

如果策略有效,请告诉我