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

将语音起止时间转为时间序列:R数据框秒级索引转换求助

把R时间段数据扩展为按0.1秒索引的数据框的方法

嘿,我来帮你搞定这个问题!你想要把原始的「时间段-单词」对应数据,拆成每个0.1秒时间点对应单词的格式,用tidyverse工具就能轻松实现,步骤超清晰:

第一步:先把时间格式转成数值好处理

首先得把原始数据里带s的时间字符串转成数值类型,不然没法生成连续的时间序列。先把你的数据读入R,再处理时间列:

# 构造你的原始数据框
df <- data.frame(
  startTime = c("1.900s", "2.300s", "2.800s", "3s", "3.400s", "3.500s", "3.800s"),
  endTime = c("2.300s", "2.800s", "3s", "3.400s", "3.500s", "3.800s", "4.300s"),
  word = c("hey", "I'm", "John", "right", "now", "I", "help")
)

# 去掉时间字符串末尾的"s",转换为数值型
df$start_num <- as.numeric(sub("s", "", df$startTime))
df$end_num <- as.numeric(sub("s", "", df$endTime))

第二步:为每个时间段生成所有时间点

接下来用purrr包的map2函数,给每一行的时间段生成间隔0.1秒的时间点,再把这些点展开成多行,最后转成你需要的格式:

library(tidyverse)

# 生成时间序列并展开为目标格式
result_df <- df %>%
  # 为每个时间段生成从start到end前0.1秒的序列(避免重复时间点)
  mutate(time_points = map2(start_num, end_num, ~seq(.x, .y - 0.1, by = 0.1))) %>%
  # 把列表格式的时间序列拆成单独行
  unnest(time_points) %>%
  # 把数值时间转回带3位小数和"s"的字符串格式
  mutate(Time = sprintf("%.3fs", time_points)) %>%
  # 只保留需要的两列
  select(Time, word)

# 查看前10行结果
head(result_df, 10)

关键细节解释

  • seq(.x, .y - 0.1, by = 0.1):因为原始数据里的endTime刚好是下一个单词的startTime,所以我们生成到end前0.1秒,这样像2.300s这类边界时间只会对应下一个单词,不会同时属于两个时间段。
  • sprintf("%.3fs", time_points):确保时间格式和你期望的完全一致,比如2.0会自动补成2.000s的格式。

如果之后需要调整时间间隔(比如改成整秒),只要把seq里的by改成1,同时把.y - 0.1改成.y - 1就可以啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:50:31