如何基于含跨小时的不规则毫秒级分钟序列生成相对时间向量
解决跨小时场景下的毫秒级时间序列相对时长计算
给定带毫秒的不规则时间序列(可能存在跨小时情况):
msc <- c("58:49.5", "59:05.3","59:37.0", "59:50", "00:00.4", "01:41.5","03:49.5")
需求是:将第一个时间点"58:49.5"设为基准"00:00.0",计算每个时间点相对基准的经过时长,生成对应的时间格式向量。
实现步骤
- 统一时间格式:补全缺失毫秒的条目(比如
"59:50"改为"59:50.0"),确保所有时间字符串结构一致。 - 处理跨小时逻辑:通过前后时间的分钟数对比判断是否进入下一小时,给对应时间的总秒数加上3600(一小时的秒数)。
- 计算相对时长:用每个时间点的总秒数减去基准点的总秒数,得到相对秒数。
- 格式化为目标字符串:将相对秒数转换为指定的时间格式(支持
hh:mm:ss.s或mm:ss.s两种格式)。
完整代码
# 原始时间向量 msc <- c("58:49.5", "59:05.3","59:37.0", "59:50", "00:00.4", "01:41.5","03:49.5") # 1. 统一格式,补全缺失的毫秒部分 msc_fixed <- ifelse(grepl("\\.", msc), msc, paste0(msc, ".0")) # 2. 拆分分钟和秒,计算总秒数并处理跨小时 time_parts <- strsplit(msc_fixed, ":") mins <- as.numeric(sapply(time_parts, `[`, 1)) secs <- as.numeric(sapply(time_parts, `[`, 2)) # 计算小时偏移:如果当前分钟小于前一个,说明跨小时,累计偏移量 hour_offset <- c(0, cumsum(diff(mins) < 0)) total_secs <- mins * 60 + secs + hour_offset * 3600 # 3. 计算相对基准点的秒数差 relative_secs <- total_secs - total_secs[1] # 4. 格式化为 hh:mm:ss.s 格式(统一显示小时) format_relative_time <- function(sec) { hours <- floor(sec / 3600) remaining_sec <- sec %% 3600 mins <- floor(remaining_sec / 60) secs <- remaining_sec %% 60 sprintf("%02d:%02d:%04.1f", hours, mins, secs) } # 生成结果向量 result <- sapply(relative_secs, format_relative_time) print(result)
输出结果
[1] "00:00:00.0" "00:00:15.8" "00:00:47.5" "00:01:00.5" "00:01:10.9" "00:03:02.0" "00:05:00.0"
如果需要小时为0时不显示小时部分的mm:ss.s格式,可修改格式化函数:
format_relative_time <- function(sec) { hours <- floor(sec / 3600) remaining_sec <- sec %% 3600 mins <- floor(remaining_sec / 60) secs <- remaining_sec %% 60 if (hours > 0) { sprintf("%02d:%02d:%04.1f", hours, mins, secs) } else { sprintf("%02d:%04.1f", mins, secs) } }
修改后的输出:
[1] "00:00.0" "00:15.8" "00:47.5" "01:00.5" "01:10.9" "03:02.0" "05:00.0"
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

