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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:50:04