【问题标题】:Formatting time with strptime when some times are missing and convert AM/PM to 24 hour format当缺少某些时间时使用 strptime 格式化时间并将 AM/PM 转换为 24 小时格式
【发布时间】:2017-02-14 16:55:36
【问题描述】:

我有一个像

这样的时间戳向量
time_stamp <- c("7/1/2013", "7/1/2013 12:00:30 AM", "7/1/2013 12:01:00 AM", "7/1/2013 12:01:30 AM", "8/1/2013","8/1/2013 11:02:30 PM")

我想将此格式化为日期类。我试过了

strptime(time_stamp, format = "%d/%m/%Y %H:%M:%S", tz = "GMT")

但由于两个时间戳缺少时间,因此会导致NAs,默认情况下应替换为:12:00:00。

我可以运行一个循环,例如:

for (i in 1:length(time_stamp))
{
   if(nchar(time_stamp[i])<11)
   {
       time_stamp[i] <- paste(time_stamp[i], " 12:00:00 AM")
    }
}

time_stamp <- format(strptime(time_stamp, format = "%d/%m/%Y %I:%M:%S %p", tz = "GMT"), "%d/%m/%Y %H:%M:%S", tz = "GMT")

有没有更快更干净的方法来完成这个?该向量是大型数据集的一部分,所以我不想循环它。

【问题讨论】:

    标签: r datetime format converter


    【解决方案1】:

    lubridate::parse_date_time 可以接受多个令牌订单,带或不带%

    lubridate::parse_date_time(time_stamp, orders = c("dmy IMS p", "dmy"))
    ## [1] "2013-01-07 00:00:00 UTC" "2013-01-07 00:00:30 UTC" "2013-01-07 00:01:00 UTC"
    ## [4] "2013-01-07 00:01:30 UTC" "2013-01-08 00:00:00 UTC" "2013-01-08 23:02:30 UTC"
    

    或者使用它的truncated参数:

    lubridate::parse_date_time(time_stamp, orders = 'dmy IMS p', truncated = 4)
    

    返回相同的东西。

    【讨论】:

      【解决方案2】:

      或者使用一些正则表达式替换,然后正常处理:

      as.POSIXct(sub("(\\d{4}$)", "\\1 00:00:00", time_stamp),
                 format = "%d/%m/%Y %H:%M:%S", tz = "GMT")
      #[1] "2013-01-07 00:00:00 GMT" "2013-01-07 12:00:30 GMT" "2013-01-07 12:01:00 GMT"
      #[4] "2013-01-07 12:01:30 GMT" "2013-01-08 00:00:00 GMT" "2013-01-08 11:02:30 GMT"
      

      【讨论】:

      • 谢谢!您能否解释一下上下文中使用的正则表达式。
      • @discipulus - 它本质上只是用 4 位数字 \\1 加上 00:00:00 替换了文本末尾 d{4} 的最后 4 位数字 d{4}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多