Не ясно, если время в 24-часовом формате.Вы можете сначала создать последовательность получасовых временных интервалов, затем объединить с исходным набором данных, прежде чем использовать zoo::na.locf
для переноса последнего наблюдения вперед:
data:
library(data.table)
DT <- fread("ID,t2,t1,varX,varY
A,10-01-2019 06:00:00 PM,10-01-2019 12:00:00 PM,100,Y1
A,10-01-2019 06:00:00 PM,10-01-2019 12:30:00 PM,60,Y2
B,10-01-2019 06:00:00 PM,10-01-2019 01:00:00 PM,100,Y2
A,10-01-2019 06:30:00 PM,10-01-2019 01:30:00 PM,100,Y3
B,10-01-2019 06:30:00 PM,10-01-2019 02:00:00 PM,200,Y4
C,10-01-2019 07:00:00 PM,10-01-2019 04:00:00 PM,100,Y3")
cols <- c("t2", "t1")
DT[, (cols) := lapply(.SD, as.POSIXct, format="%d-%m-%Y %I:%M:%S %p"), .SDcols=cols]
code:
library(zoo)
DT[DT[,.(t1=rev(seq(t2-30*60, length.out=48L, by="-30 mins"))), by=.(ID, t2)],
.(ID=i.ID, t2=i.t2, t1=i.t1, varX=varX, varY=varY),
on=.(ID, t2, t1)][,
c("varX", "varY") := lapply(.SD, na.locf, na.rm=FALSE),
, by=.(ID, t2), .SDcols=c("varX", "varY")][]