如何为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
相关产品推荐
相关产品推荐

