从时间数据集中绘制瞬时时间点总和

时间:2013-10-03 01:33:38

标签: r plot dataset visualization temporal

我有一个SQL查询数据集,包含开始和结束时间戳以及运行的特定查询。我想使用这些信息来可视化在任何给定时间执行的并发查询的数量。

就像这样的数据集:

StartTime,StopTime,SQLStatement
10/11/2012 08:17:18.060,10/11/2012 08:17:19.221,DELETE FROM foo WHERE bar = ?;
10/11/2012 08:17:19.036,10/11/2012 08:17:19.911,SELECT * FROM users WHERE user_id = ?;
10/11/2012 08:17:19.661,10/11/2012 08:17:19.810,SELECT * FROM users WHERE user_id = ?;
...

我想生成横轴表示时间的图,纵轴表示运行的查询的瞬时数。在上面的示例中,有一个查询在08:17:19.000运行,两个查询在08:17.19.100运行。

我天真的方法是迭代大约100万个离散时间值,计算跨越每个值的StartTime和StopTime的行。这很慢,并且不会特别好地扩展 - 似乎 R 会有更好的方法来做到这一点!

此数据的15分钟样本包含约170,000行,精确到毫秒级 - 可以合理地扩展到一天的数据的方法将受到赞赏,但欢迎任何解决方案!

1 个答案:

答案 0 :(得分:0)

我的简单方法

# Millisecond precision for deltas
options(digits.secs=3)

# Load file
log.file <- read.csv("data/raw.csv", header=T)

log.file$StartTime <- as.POSIXct(log.file$StartTime ,
                                 format="%Y-%m-%d %H:%M:%OS")
log.file$StopTime <- as.POSIXct(log.file$StopTime ,
                                format="%Y-%m-%d %H:%M:%OS")

range <- seq(min(log.file$StartTime), max(log.file$StopTime), by=1)

getsum <- function(tstamp) {
  ret <- nrow(subset(log.file, StartTime<=tstamp & StopTime>=tstamp))
  return(ret)
}

dset <- frame()
dset$TIME <- range
dset$COUNT <- lapply(range, getsum)

plot(dset$TIME, dset$COUNT)

更好的解决方案

虽然这并不完全符合我之前提出的标准(即没有填补时间间隔),但它确实给了我一张接近我正在寻找的图表。但是,如果有一个解决方案符合我之前要求的两点,我仍然感兴趣。

# Millisecond precision for deltas
options(digits.secs=3)

# Load file
log.file <- read.csv("data/raw.csv", header=T)

log.file$StartTime <- as.POSIXct(log.file$StartTime ,
                                 format="%Y-%m-%d %H:%M:%OS")
log.file$StopTime <- as.POSIXct(log.file$StopTime ,
                                format="%Y-%m-%d %H:%M:%OS")

# Create data frames for query start times and query stop times
# and give them +1 and -1 values
queries.start <- data.frame(Time=log.file$StartTime, Value=1)
queries.stop <- data.frame(Time=log.file$StopTime, Value=-1)

# Merge the two together and order by time
queries.both <- rbind(queries.start, queries.stop)
queries.both <- queries.both[with(queries.both, order(Time)), ]

# Create a cumulative sum data frame, and plot the results
queries.sum <- data.frame(Time=queries.both$Time, Queries=cumsum(queries.both$Value))
plot(queries.sum, type="l")