如何在 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
我正在尝试创建一个循环,该循环将在我的 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