You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为R数据框中无秒数的时间戳添加:00?

问题:补全日期时间列中缺失的秒数

我有一列格式不一致的日期时间数据,部分时间戳缺少秒数,需要给这些无秒数的记录末尾添加:00。

数据定义

df <- data.frame(date.time=c("10-29-2022 09:46:40", "02-27-2023 22:53:53", "12-15-2022 02:54:03", "01-09-2023 14:44", "03-05-2023 14:58", "02-18-2023 19:46:35", "12-10-2022 16:50"))

错误尝试

我能通过正则匹配到无秒数的字符串,但使用gsub替换时错误覆盖了整个字符串,当前代码如下:

df %>%
  mutate_at(.vars = "date.time", 
            .funs = gsub,
            pattern = "^\\d\\d-\\d\\d-\\d\\d\\d\\d \\d\\d:\\d\\d$",
            replacement = "\\d\\d-\\d\\d-\\d\\d\\d\\d \\d\\d:\\d\\d:00")

解决方案

问题出在替换字符串中的\\d\\d是正则语法,无法引用匹配到的内容。正确做法是利用捕获组引用匹配结果,或直接追加内容:

方法1:捕获组引用

library(dplyr)
df %>%
  mutate(date.time = gsub("^(\\d\\d-\\d\\d-\\d\\d\\d\\d \\d\\d:\\d\\d)$", "\\1:00", date.time))
  • 解释:(...)将整个无秒数的时间戳作为捕获组1,\\1引用该组内容,再追加:00,实现仅补全秒数。

方法2:直接引用整个匹配结果

df %>%
  mutate(date.time = gsub("^\\d\\d-\\d\\d-\\d\\d\\d\\d \\d\\d:\\d\\d$", "\\0:00", date.time))
  • 解释:\\0代表整个匹配到的字符串,直接在末尾添加:00,效果与方法1一致。

方法3:通过字符串长度判断(更直观)

如果无秒数的字符串固定为16位,有秒数的为19位,可结合stringr包实现:

library(dplyr)
library(stringr)
df %>%
  mutate(date.time = ifelse(nchar(date.time) == 16, str_pad(date.time, 19, side = "right", pad = ":00"), date.time))

处理结果

执行后,date.time列所有记录均包含秒数:

df$date.time
# [1] "10-29-2022 09:46:40" "02-27-2023 22:53:53" "12-15-2022 02:54:03" "01-09-2023 14:44:00"
# [5] "03-05-2023 14:58:00" "02-18-2023 19:46:35" "12-10-2022 16:50:00"

内容的提问来源于stack exchange,提问作者Loz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:14:55