我有一个看起来像这样的CSV文件,其中“time”是UNIX时间戳:
time,count
1300162432,5
1299849832,0
1300006132,1
1300245532,4
1299932932,1
1300089232,1
1299776632,9
1299703432,14
... and so on
我正在将其读入R并将时间列转换为POSIXct,如下所示:
data <- read.csv(file="data.csv",head=TRUE,sep=",")
data[,1] <- as.POSIXct(data[,1], origin="1970-01-01")
到目前为止很棒,但现在我想构建一个直方图,每个bin对应于平均每小时计数。我坚持按小时选择,然后再计数。我查看了?POSIXt
和?cut.POSIXt
,但如果答案在那里,我就没有看到。
任何帮助都将不胜感激。
答案 0 :(得分:3)
这是一种方式:
R> lines <- "time,count
1300162432,5
1299849832,0
1300006132,1
1300245532,4
1299932932,1
1300089232,1
1299776632,9
1299703432,14"
R> con <- textConnection(lines); df <- read.csv(con); close(con)
R> df$time <- as.POSIXct(df$time, origin="1970-01-01")
R> df$hour <- as.POSIXlt(df$time)$hour
R> df
time count hour
1 2011-03-15 05:13:52 5 5
2 2011-03-11 13:23:52 0 13
3 2011-03-13 09:48:52 1 9
4 2011-03-16 04:18:52 4 4
5 2011-03-12 12:28:52 1 12
6 2011-03-14 08:53:52 1 8
7 2011-03-10 17:03:52 9 17
8 2011-03-09 20:43:52 14 20
R> tapply(df$count, df$hour, FUN=mean)
4 5 8 9 12 13 17 20
4 5 1 1 1 0 9 14
R>
您的数据实际上并不是每天每小时有多个条目,但这会在几个小时内平均,从POSIX时间戳正确解析。您可以根据需要使用TZ信息进行调整。
答案 1 :(得分:1)
您可以通过转换为POSIXlt
并减去分钟和秒组件来计算每次的小时“bin”。然后,您可以在数据框中添加一个包含小时bin标记的新列,如下所示:
date.to.hour <- function (vec)
{
as.POSIXct(
sapply(
vec,
function (x)
{
lt = as.POSIXlt(x)
x - 60*lt$min - lt$sec
}),
tz="GMT",
origin="1970-01-01")
}
data$hour <- date.to.hour(as.POSIXct(data[,1], origin="1970-01-01"))
答案 2 :(得分:1)
在Mages' blog上有关于此主题的好文章。获取分段数据:
aggregate(. ~ cut(time, 'hours'), data, mean)
如果您只想要快速图表,ggplot2是您的朋友:
qplot(cut(time, "hours"), count, data=data, stat='summary', fun.y='mean')
不幸的是,因为cut返回一个因子,x轴将无法正常工作。您可能想要编写自己的,不那么笨拙的时间段功能,例如
timebucket = function(x, bucketsize = 1,
units = c("secs", "mins", "hours", "days", "weeks")) {
secs = as.numeric(as.difftime(bucketsize, units=units[1]), units="secs")
structure(floor(as.numeric(x) / secs) * secs, class=c('POSIXt','POSIXct'))
}
qplot(timebucket(time, units="hours"), ...)