以hh:mm为单位创建32Hz的时间序列:ss

问题描述:

我想创建一个从00:00:00到00:38:24间隔1/32秒的时间序列。这意味着很多次会重复,但没关系。以hh:mm为单位创建32Hz的时间序列:ss

我已经试过:

require(lubridate) 

#Convert 00:38:24 to seconds 
timeEnd<-period_to_seconds(hms("00:38:24")) 
>timeEnd 
[1] 2304 

#Total number of elements in sequence 
timeEnd*32Hz=73728 elements 

#Create a sequence from 0 to timeEnd in 1/32 steps 
t<-seq(0,timeEnd,by=1/32) #This bit is wrong! makes 73729 elements 

#Convert to 00:00:00 format 
sprintf('%02d:%02d:%02d', seconds_to_period(t)@hour, minute(seconds_to_period(t)), second(seconds_to_period(t))) 

>t[1:5] 
[1] "00:00:00" "00:00:00" "00:00:00" "00:00:00" "00:00:00" 
  1. 有没有更好的解决办法?
  2. 序列中元素的数量错误。它应该是73728,但我得到73729.为什么?
+0

73729元素是正确的。例如。步骤= 1的从0到2的序列是'c(0,1,2)',即3个元素不是2,因为它也包括初始零。 – digEmAll

我不知道这是否是更好的解决方案;但只使用base和stringi,并使用一个函数作为包装来增加灵活性。时间值可以作为一个字符传递,时间以分数或其他方式递增。

f <- function(start_time = "00:00:00", end_time = "00:38:24", 
       time_inc = 1/32, ...){ 

    options(digits.secs=4) 

    tl <- lapply(list(start_time, end_time), function(i){ 
      as.POSIXct(i, format = "%H:%M:%OS", tz = "EST") 
      }) 

    as_seq <- seq(tl[[1]], tl[[2]], by = time_inc) 

    stringi::stri_datetime_format(as_seq, format = "HH:mm:ss:SSSS") 
} 

time.seq <- f() 

> head(time.seq) 
[1] "00:00:00:0000" "00:00:00:0310" "00:00:00:0620" "00:00:00:0930" "00:00:00:1250" "00:00:00:1560" 
> tail(time.seq) 
[1] "00:38:23:8430" "00:38:23:8750" "00:38:23:9060" "00:38:23:9370" "00:38:23:9680" "00:38:24:0000"