我正在尝试使用我们的apache日志文件来每秒绘制请求。 我已经将日志按下到一个简单的时间戳列表,每个请求一个条目。
4时02分28秒
4时02分28秒
4时02分28秒
4时02分29秒
...
我无法弄清楚如何让R识别为时间和聚合到每秒。 谢谢你的帮助
答案 0 :(得分:3)
使用rubridate软件包可以非常轻松地处理日期和时间。
这是一个例子,使用了lubridate的hms()函数。 hms将字符串转换为具有单独列的数据帧,包括小时,分钟和秒。 myd(月 - 日 - 年),dmy(日 - 月 - 年),ms(分 - 秒)有类似的功能......你明白了。
library(lubridate)
data <- c("04:02:28", "04:02:28", "04:02:28", "04:02:29")
times <- hms(data)
times$second
[1] 28 28 28 29
此时,时间是一个直接的数据框,您可以隔离任何所需的列:
str(times)
Classes 'period' and 'data.frame': 4 obs. of 6 variables:
$ year : num 0 0 0 0
$ month : num 0 0 0 0
$ day : num 0 0 0 0
$ hour : num 4 4 4 4
$ minute: num 2 2 2 2
$ second: num 28 28 28 29
答案 1 :(得分:1)
我不确定,如何正确地做到这一点,但这应该是一种可能的方式,也许可以帮助你。
取代字符串,将数据作为UNIX时间戳从数据库中获取,表示1970-01-01的秒数。
使用hist(数据)绘制直方图。或者您可以使用melt
包中的reshape2
命令并使用cast
创建数据框,其中一列是时间戳,另一列确定当时的事务数。
使用as.POSIXlt(your.unix.timestamps, origin="1970-01-01", tz="GMT")
将时间戳转换为R可理解的日期时间结构。
然后使用format
使用第3点的数据为地块添加标签。
以下是一个例子:
# original data
data.timestamps = c(1297977452, 1297977452, 1297977453, 1297977454, 1297977454, 1297977454, 1297977455, 1297977455)
data.unique.timestamps = unique(data.timestamps)
# get the labels
data.labels = format(as.POSIXlt(data.unique.timestamps, origin="1970-01-01", tz="GMT"), "%H:%M:%S")
# plot the histogram without axes
hist(data.timestamps, axes=F)
# add axes manually
axis(2)
axis(1, at=unique(data.timestamps), labels=data.labels)
- 希望这有帮助
答案 2 :(得分:1)
在我看来,既然您已经有一秒钟的时间戳,那么您需要做的就是对时间戳进行频率计数,并在原始时间顺序中绘制频率 。说timeStamps
是你的时间戳数组,然后你会这样做:
plot(c( table( timeStamps ) ) )
我假设您想在一段时间内以每一秒的间隔绘制日志消息。另外我假设HMS时间戳在一天之内。请注意,table
函数会生成其参数的频率计数。