将语音起止时间转为时间序列: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
相关产品推荐
相关产品推荐

