【问题标题】:Replace dashes with colon in part of string在部分字符串中用冒号替换破折号
【发布时间】:2017-03-22 04:05:38
【问题描述】:

我有一个数据框,其中包含从数据库中提取的日期和时间值作为字符。目前日期/时间如下所示:2017-03-17 11-56-20

我希望它看起来像这样2017-03-17 11:56:20

这似乎不像R: How to replace . in a string?中那样使用gsub替换所有破折号那么简单

我认为这与定位有关,比如告诉 R 只看空间。想法?

【问题讨论】:

  • as.character(strptime(x, "%Y-%m-%d %H-%M-%S", tz = ""))?
  • @A5C1D2H2I1M1N2O1R2T1 这看起来像是对我的回答:-)
  • gsub("(\\d\\d)-(\\d\\d)-(\\d\\d)$", "\\1:\\2:\\3", x) 是另一种选择,它不会使用 R 的日期/时间 API,可能不是一个好的解决方案
  • 这太容易了!完美而简单地工作。你摇滚。
  • @TimBiegeleisen 如果目标只是获取一个字符串 thoug,我很确定 gsub 会比 strptime 快。

标签: r replace gsub


【解决方案1】:

由于您处理的是日期时间对象,因此您可以使用strptime

x <- "2017-03-17 11-56-20"
as.character(strptime(x, "%Y-%m-%d %H-%M-%S", tz = ""))
# [1] "2017-03-17 11:56:20"  

【讨论】:

  • 而且 as.POSIXct 也可以工作——从长远来看甚至更好。我打算先采取简单的婴儿步骤。
【解决方案2】:

尝试匹配以下模式:

(\\d\\d)-(\\d\\d)-(\\d\\d)$

然后将其替换为:

\\1:\\2:\\3

这将完全匹配您的时间戳,因为模式末尾的终端锚$。然后,我们使用冒号和三个捕获组按照您想要的方式重建时间戳。

gsub("(\\d\\d)-(\\d\\d)-(\\d\\d)$", "\\1:\\2:\\3", x)
[1] "2017-03-17 11:56:20"

【讨论】:

    【解决方案3】:

    您也可以使用library(anytime) 为您处理格式(这也强制转换为POSIX

    library(anytime)
    
    anytime(x)
    # [1] "2017-03-17 11:56:20 AEDT"
    
    as.character(anytime(x))
    # [1] "2017-03-17 11:56:20"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      相关资源
      最近更新 更多