【发布时间】:2011-02-17 20:53:18
【问题描述】:
我正在尝试使用我们的 apache 日志文件绘制每秒请求数。 我已经将日志整理成一个简单的时间戳列表,每个请求一个条目。
04:02:28
04:02:28
04:02:28
04:02:29
...
我不太明白如何让 R 识别为时间并聚合到每秒。 感谢您的帮助
【问题讨论】:
-
附带说明,您可能对Logstalgia 感兴趣,以获得一些有趣的可视化效果
标签: r
我正在尝试使用我们的 apache 日志文件绘制每秒请求数。 我已经将日志整理成一个简单的时间戳列表,每个请求一个条目。
04:02:28
04:02:28
04:02:28
04:02:29
...
我不太明白如何让 R 识别为时间并聚合到每秒。 感谢您的帮助
【问题讨论】:
标签: r
lubridate 包使处理日期和时间变得非常容易。
这是一个示例,使用 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
此时,times 是一个直截了当的数据框,您可以隔离任何您希望的列:
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
【讨论】:
在我看来,由于您已经拥有一秒粒度的时间戳,您需要做的就是对时间戳进行频率计数并以原始时间顺序绘制频率 。假设timeStamps 是您的时间戳数组,那么您会这样做:
plot(c( table( timeStamps ) ) )
我假设您想在特定时间段内以每一秒的间隔绘制日志消息。另外我假设 HMS 时间戳在一天之内。请注意,table 函数会生成其参数的频率计数。
【讨论】:
我不太确定如何正确地做到这一点,但这应该是一种可能的方式,也许对你有帮助。
代替字符串,从数据库中获取 UNIX 时间戳的数据,表示从 1970-01-01 开始的秒数。
例如,使用 hist(data) 绘制直方图。或者您可以使用reshape2 包中的melt 命令并使用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)
-- 希望这会有所帮助
【讨论】: