在日期字符中删除0

时间:2017-10-06 14:17:16

标签: r regex date

我正在寻找一种在day and month日期表示中放弃(如果存在)0的方法。另外,我有角色的格式......

以下是我想要的可重现的例子:

df <-
  data.frame(
    exemple = c(
      "01/12/2017",
      "01-02-2017",
      "2017/02/12",
      "2017/02/01",
      "2017/02/01 10:01:05",
      "2017/02/01 02:01:05"
    ),
    format  = c(
      "%d/%m/%Y"  ,
      "%d-%m-%Y"  ,
      "%Y/%d/%m"  ,
      "%Y/%d/%m"  ,
      "%Y/%d/%m %H:%m:%s"  ,
      "%Y/%d/%m %H:%m:%s"
    ),
    result  = c(
      "1/12/2017",
      "1-2-2017"  ,
      "2017/2/12" ,
      "2017/2/1"  ,
      "2017/2/1 10:01:05"  ,
      "2017/2/1 02:01:05"
    )
  )

哪个给:

              exemple            format            result
1          01/12/2017          %d/%m/%Y         1/12/2017
2          01-02-2017          %d-%m-%Y          1-2-2017
3          2017/02/12          %Y/%d/%m         2017/2/12
4          2017/02/01          %Y/%d/%m          2017/2/1
5 2017/02/01 10:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 10:01:05
6 2017/02/01 02:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 02:01:05

它包含以下列:

  • 示例:我的日期
  • 格式:每个日期的格式
  • 结果:我想要的。

正如您所看到的,每个日期都有不同的格式,因此我希望以最通用的方式来完成它。 最通用的,我的意思是它应该适用于任何类型的分隔符,以及任何日期格式

编辑:

请注意,我注意到变量的内容与格式化输出混淆:我想改变它自己的角色。

感谢。

2 个答案:

答案 0 :(得分:1)

这是实现目标的一种方式:

df$myresult = gsub("(?<=^|(?![:])[[:punct:]])0", "", df$exemple, perl = TRUE)

<强>结果:

> df
              exemple            format            result          myresult
1          01/12/2017          %d/%m/%Y         1/12/2017         1/12/2017
2          01-02-2017          %d-%m-%Y          1-2-2017          1-2-2017
3          2017/02/12          %Y/%d/%m         2017/2/12         2017/2/12
4          2017/02/01          %Y/%d/%m          2017/2/1          2017/2/1
5 2017/02/01 10:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 10:01:05 2017/2/1 10:01:05
6 2017/02/01 02:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 02:01:05 2017/2/1 02:01:05

注意:

这个正则表达式看起来有点奇怪,因为我在一个积极的外观背后放置了一个负面的前瞻。 (?![:])[[:punct:]]匹配所有标点符号,但 :除外。因此,整个正则表达式匹配所有0,它们来自标点符号:之后,或者位于字符串的开头

答案 1 :(得分:0)

这将通过查找包含四位数年份的字符串来标识日期,然后使用gsub删除任何前面没有其他数字的零。所以它应该留下数年,时间和非领先的零点。函数中的x是第一个参数(即日期)的捕获组。

如果您将:作为日期分隔符,或:以外的其他内容(例如-)作为时间分隔符,这甚至应该有效,但如果您有两位数的年份。

library(gsubfn)
df$result <- gsubfn("([^\\s]*\\d{4}[^\\s]*)",
                    ~gsub("(^|[^0-9]+)0(\\d+)", "\\1\\2", x),
                    as.character(df$exemple))

df
              exemple            format            result
1          01/12/2017          %d/%m/%Y         1/12/2017
2          01-02-2017          %d-%m-%Y          1-2-2017
3          2017/02/12          %Y/%d/%m         2017/2/12
4          2017/02/01          %Y/%d/%m          2017/2/1
5 2017/02/01 10:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 10:01:05
6 2017/02/01 02:01:05 %Y/%d/%m %H:%m:%s 2017/2/1 02:01:05