在R语言中将时间分隔符从小数点替换为冒号的方法
问题:将数值型时间列的小数点替换为冒号生成新列
现有数据集,df$Time为数值列,时间以HH.MM格式存储(如15.00代表15:00),需生成格式正确的字符列df$time(将小数点替换为冒号);df$Date为字符列。已尝试多种基于dplyr、stringr的方法未解决,以下是数据示例及尝试过的方法:
数据集示例
dput(head(df))结果:
structure(list(Date = c("01/03/2024", "01/03/2024", "01/03/2024", "01/03/2024", "01/03/2024", "01/03/2024"), Time = c(0, 0.05, 0.1, 0.15, 0.2, 0.25)), row.names = c(NA, 6L), class = "data.frame")
两小时片段数据:
Date Time 181 01/03/2024 15.00 182 01/03/2024 15.05 183 01/03/2024 15.10 184 01/03/2024 15.15 185 01/03/2024 15.20 186 01/03/2024 15.25 187 01/03/2024 15.30 188 01/03/2024 15.35 189 01/03/2024 15.40 190 01/03/2024 15.45 191 01/03/2024 15.50 192 01/03/2024 15.55 193 01/03/2024 16.00 194 01/03/2024 16.05 195 01/03/2024 16.10 196 01/03/2024 16.15 197 01/03/2024 16.20 198 01/03/2024 16.25 199 01/03/2024 16.30 200 01/03/2024 16.35 201 01/03/2024 16.40 202 01/03/2024 16.45 203 01/03/2024 16.50 204 01/03/2024 16.55 205 01/03/2024 17.00
尝试过的方法
- 方法1:
df$time <- df %>% mutate(across(everything(), ~str_replace(., ",", ".")))
- 方法2:
df$time <- str_replace(df$Time, ".", ":")
- 方法3:
df$Time <- as.character(df$Time) df$time <- gsub(".", ":", df$Time, fixed = T)
- 方法4:
df$time <- strptime(as.character(df$Time), "%H.%M") df$time <- format(df$time, "%H:%M")
- 方法5:
df$time <- as.POSIXlt(df$Time)
- 方法6:
df$time <- df$Time df$time <- gsub(".", ":", df$time)
- 方法7:
df$time <- df$Time df$time <- str_replace_all(df$time, ".", ":")
可行解决方案
方案1:Base R 直接格式化(无需额外包)
核心逻辑是拆分Time的整数部分(小时)和小数部分(分钟),统一格式化为HH:MM:
df$time <- sprintf("%02d:%02d", floor(df$Time), # 提取整数部分作为小时 round((df$Time - floor(df$Time)) * 100)) # 小数部分乘100得到分钟,round避免浮点误差
该方法能处理所有情况:
- 0 →
00:00 - 0.05 →
00:05 - 15.55 →
15:55 - 17.00 →
17:00
方案2:字符串格式化(依赖stringr)
先将数值转为固定长度的带两位小数的字符串,再替换小数点为冒号:
library(stringr) df$time <- str_replace( str_pad(sprintf("%.2f", df$Time), 5, side = "left", pad = "0"), "\\.", ":" )
解释:
sprintf("%.2f", df$Time):将数值转为两位小数的字符串(如0→0.00,15→15.00)str_pad(..., 5, side = "left", pad = "0"):补全为5位字符串(如0.00→00.00)str_replace(..., "\\.", ":"):替换小数点为冒号,得到HH:MM格式
内容的提问来源于stack exchange,提问作者Autumn
相关产品推荐
相关产品推荐

