【问题标题】:How can you insert a colon every two characters?如何每两个字符插入一个冒号?
【发布时间】:2014-01-05 01:51:49
【问题描述】:

我有一列时间值,除了它们是字符格式并且没有用于分隔 H、M、S 的冒号。该列类似于以下内容:

Time
024201
054722
213024
205022
205024
125440 

我想将列中的所有值转换为H:M:S 格式的实际时间值。这些值已经采用HMS 格式,因此只需插入冒号即可,但事实证明这比我想象的要困难。我发现了一个包,它从右边每三位添加逗号,使字符串看起来像货币值,但没有时间(也没有添加日期值,我不想这样做)。任何帮助将不胜感激。

【问题讨论】:

    标签: r


    【解决方案1】:

    由于数据与时间相关,您应该考虑将其存储为 POSIX 格式:

    > df <- data.frame(Time=c("024201", "054722", "213024", "205022", "205024", "125440")
    > df$Time <- as.POSIXct(df$Time, format="%H%M%S")
    > df
    
                     Time
    1 2014-01-05 02:42:01
    2 2014-01-05 05:47:22
    3 2014-01-05 21:30:24
    4 2014-01-05 20:50:22
    5 2014-01-05 20:50:24
    6 2014-01-05 12:54:40
    

    只输出时间:

    > format(df, "%H:%M:%S")
          Time
    1 02:42:01
    2 05:47:22
    3 21:30:24
    4 20:50:22
    5 20:50:24
    6 12:54:40
    

    【讨论】:

    • 尽管正则表达式的答案非常有帮助,但我喜欢这样可以保留数据值的时间性质。谢谢!
    【解决方案2】:

    带有环视功能的正则表达式适用于此:

    gsub('(..)(?=.)', '\\1:', x$Time, perl=TRUE)
    

    (?=.) 表示必须跟随一个字符(由. 匹配),但不被视为匹配的一部分(并且不会被捕获)。

    【讨论】:

      【解决方案3】:

      这是一个正则表达式解决方案:

      x <- readLines(n=6)
      024201
      054722
      213024
      205022
      205024
      125440 
      
      gsub("(\\d\\d)(\\d\\d)(\\d\\d)", "\\1:\\2:\\3", x)
      
      ## [1] "02:42:01"  "05:47:22"  "21:30:24" 
      ## [4] "20:50:22"  "20:50:24"  "12:54:40 "
      

      (\\d\\d) 表示我们正在寻找 2 位数字。括号将字符串分成 3 部分。然后\\1: 说取块 1 并在其后放置一个冒号。

      【讨论】:

        【解决方案4】:

        或通过日期/时间类:

        time <- c("024201", "054722", "213024", "205022", "205024", "125440")
        time <- as.POSIXct(paste0("1970-01-01", time), format="%Y-%d-%m %H%M%S")
        (time <- format(time, "%H:%M:%S"))
        # [1] "02:42:01" "05:47:22" "21:30:24" "20:50:22" "20:50:24" "12:54:40"
        

        【讨论】:

          【解决方案5】:

          这给出了一个chron "times" 类向量:

          > library(chron)
          > times(gsub("(..)(..)(..)", "\\1:\\2:\\3", DF$Time))
          [1] 02:42:01 05:47:22 21:30:24 20:50:22 20:50:24 12:54:40
          

          “times”类可以显示时间而不必显示日期,并且支持时间的各种方法。

          另一方面,如果只需要一个字符串,那么只需要gsub 部分。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-24
            • 2019-04-19
            • 1970-01-01
            • 2014-12-30
            • 2023-03-04
            相关资源
            最近更新 更多