【问题标题】:Drop 0s in date charcaters在日期字符中删除 0
【发布时间】:2017-10-06 14:17:15
【问题描述】:

我正在寻找一种在日期的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

它包含以下列:

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

如您所见,每个日期都有不同的格式,因此我正在寻找最通用的方法。 最通用的意思是它应该适用于任何类型的分隔符和任何日期格式

编辑:

请注意,我注意到变量的内容与格式化的输出混淆了:我想将字符转换为它自己。

谢谢。

【问题讨论】:

  • 您将变量的内容格式化输出混淆了。您在这里想要的只是字符的自定义转换。基础价值永远不会改变。
  • 我不这么认为...我的变量示例和格式都是字符。我想删除示例列中的 0。
  • 那更“糟糕”,因为你不能对字符做任何事情。在某些时候,您希望它们被解析。而且,很抱歉打扰您,删除零会使这更难。此外,特别是在data.frame 中,您可以保留Date(即已解析)和您想要的任何漂亮打印版本。
  • 我想针对特定用途这样做。不用担心,即使 0 被丢弃,因为格式 R 仍然能够解析它们。
  • 在我看来就像三个快速的gsubs:将"/0" 替换为"/",将"-0" 替换为"-",将"^0" 替换为""。如果您有任何情况下时间出现在字符串的开头,因为您希望在时间部分保留 0,这将失败,但这可以通过查看您的格式列来解决。

标签: r regex date


【解决方案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,或者在字符串的开头

【讨论】:

    【解决方案2】:

    这将通过查找包含四位数年份的字符串来识别日期,然后使用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
    

    【讨论】:

    • : 作为日期分隔符很少见,但两位数年份很常见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多