如何在 for 循环中使用数字时间数据?

How to use numeric time data in a for loop?

我正在尝试创建一个循环,该循环将在我的 dataframe 中创建一个 ID 列,将数据分组为 5 分钟的间隔。我希望 5 分钟的时间点从第一行开始,但我正在努力编写一个可适应较大时间变化的循环。我希望 df 看起来像这样:

我将数据转换为数字数据,但我不知道如何调整计数器以适应日期的变化,因为 300*counter 然后是

#code that takes the numeric of POS of  and generates a watch ID based on 5 minute periods

time=c(42537.6605556, 42537.6606713, 42537.6613426, 42537.6618171, 42537.6619676, 
       42537.6648380, 42563.3838542, 42563.3839699, 42563.3840856, 42563.3842014, 
       42563.3843171, 42563.3844329, 42563.3845486)

library(openxlsx)
WatchIDfun= function(input_time){
x=(TIME=as.vector(convertToDateTime(input_time)))-TIME[1]
counter=0
n=length(x)
WatchIDOrig=c()
for (i in (1:n)){
  if (i==1){
    counter=counter+1
    WatchIDOrig[i]=counter
  } else if (x[i]/300<1){
      counter=counter
      WatchIDOrig[i]=counter
    } else if (x[i]/(300*counter)>=1&!(x[i-1]/(300*counter)>=1)){
        counter=counter+1
        WatchIDOrig[i]=counter
      } else if (x[i]/(300*counter)<1){
        counter=counter
        WatchIDOrig[i]=counter
      } else {counter=counter+1
      WatchIDOrig[i]=counter}
FINALPRODUCT= data.frame(WatchIDOrig)
assign("watchID", FINALPRODUCT, envir = .GlobalEnv)
}}
WatchIDfun(time)
WatchID=c(1,1,1,1,1,2,3,3,3,3,3,3,3)

但我得到

WatchID=c(1,1,1,1,1,2,3,4,5,6,7,8,9)

在这一点上,任何事情都会有所帮助,因为我对此还很陌生!

不使用循环,但如果您除以间隔并将 UP 舍入到最接近的整数,您应该会得到相同的结果。尝试将 x 替换为您的时间变量。

x<-1:100
WatchID<-ceiling(x/5)
WatchID

如果您尝试从大于 1 的数字开始,请先减去开始时间,然后再除以 5 并四舍五入。例如,如果您希望 4000 到 4005 的 WatchID 为 1。

x<-4000:4100
WatchID<-ceiling((x-4000)/5)
WatchID

在这种情况下,将您的数据放入正确的 类、POSIXct 中会有所帮助。然后我可以计算自开始以来的时间(以秒为单位),除以得到您想要的间隔 (300),然后发言,返回整数。这样我们每过 300 秒就会得到一个新组。

time <- c(42537.6605556, 42537.6606713, 42537.6613426, 42537.6618171, 42537.6619676,
          42537.6648380, 42563.3838542, 42563.3839699, 42563.3840856, 42563.3842014,
          42563.3843171, 42563.3844329, 42563.3845486)
dtf <- data.frame(time)

dtf$time <- as.POSIXct(as.Date(dtf$time, origin="1899-12-30"))

within(dtf, {
    timegroup <- cumsum(!duplicated(floor(as.numeric(time - time[1])/300)))
    })
#                   time timegroup
# 1  2016-06-16 17:51:12         1
# 2  2016-06-16 17:51:22         1
# 3  2016-06-16 17:52:20         1
# 4  2016-06-16 17:53:00         1
# 5  2016-06-16 17:53:14         1
# 6  2016-06-16 17:57:22         2
# 7  2016-07-12 11:12:45         3
# 8  2016-07-12 11:12:54         3
# 9  2016-07-12 11:13:04         3
# 10 2016-07-12 11:13:15         3
# 11 2016-07-12 11:13:24         3
# 12 2016-07-12 11:13:35         3
# 13 2016-07-12 11:13:44         3