Here is a solution using difftime
. I have updated your example to have some lines with dates posterior to those in the history table.
#Reproducible dummy data
p <- read.table(text="
t,quantity
2013-07-31 03:42:02,30
2013-07-31 03:59:32,30
2013-07-31 04:02:22,28
2013-07-31 04:40:22,28
2013-07-31 05:50:22,28
2013-07-31 08:40:22,28",header=TRUE,sep=",")
h <- read.table(text="
t,price
2013-07-31 04:10:46,10
2013-07-31 04:35:46,10
2013-07-31 07:11:01,10
2013-07-31 08:16:36,5
2013-07-31 08:40:03,8
2013-07-31 08:47:56,7",header=TRUE,sep=",")
#Convert to POSIXct
p$t <- as.POSIXct(strptime(p$t, "%Y-%m-%d %H:%M:%S"))
h$t <- as.POSIXct(strptime(h$t, "%Y-%m-%d %H:%M:%S"))
get_closest_line_in_history <- function(x, history){
time_diffs <- difftime(x, history)
time_diffs[time_diffs<0] <- NA
res <- which.min(time_diffs)
if (length(res) != 1){
return(NA)
}else{
return(res)
}
}
sapply(p$t, get_closest_line_in_history, h$t)