按时间段汇总的数据

Pet*_*ter 7 r lubridate

这个问题询问R中的时间段聚合,大熊猫称之为重新采样.最有用的答案是使用XTS包在给定的时间段内分组,应用一些函数,如sum()或mean().

其中一条评论表明,在lubridate中有类似的东西,但没有详细说明.有人可以使用lubridate提供一个惯用的例子吗?我已经阅读了几次相关的rubridate小插图,可以想象一下lubridate和plyr的组合,但是我想确保没有一种我更容易丢失的方法.

为了使示例更真实,假设我想从此数据集中向北行驶的每日自行车总数:

library(lubridate)
library(reshape2)

bikecounts <- read.csv(url("http://data.seattle.gov/api/views/65db-xm6k/rows.csv?accessType=DOWNLOAD"), header=TRUE, stringsAsFactors=FALSE)
names(bikecounts) <- c("Date", "Northbound", "Southbound")
Run Code Online (Sandbox Code Playgroud)

数据如下所示:

> head(bikecounts)
                    Date Northbound Southbound
1 10/02/2012 12:00:00 AM          0          0
2 10/02/2012 01:00:00 AM          0          0
3 10/02/2012 02:00:00 AM          0          0
4 10/02/2012 03:00:00 AM          0          0
5 10/02/2012 04:00:00 AM          0          0
6 10/02/2012 05:00:00 AM          0          0
Run Code Online (Sandbox Code Playgroud)

GSe*_*See 8

我不知道为什么你会使用lubridate.如果你只是寻找比xts更糟糕的东西,你可以试试这个

tapply(bikecounts$Northbound, as.Date(bikecounts$Date, format="%m/%d/%Y"), sum)
Run Code Online (Sandbox Code Playgroud)

基本上,你只需要按split日期,然后应用一个函数.


lubridate可用于为分组应用问题创建分组因子.所以,例如,如果你想要每个月的总和(忽略年份)

tapply(bikecounts$Northbound, month(mdy_hms(bikecounts$Date)), sum)
Run Code Online (Sandbox Code Playgroud)

但是,它只是使用基本R函数的包装器,而在OP的情况下,我认为基本R函数as.Date是最简单的(事实证明其他Answers也忽略了你使用lubridate的请求;-)).


OP中与其他问题答案未涵盖的内容是. 拆分at 并将函数应用于每个组.您可以使用该函数找到对给定任务有用的端点.例如,如果你有一个xts对象,那么就会给你每个月最后一行的行号. 利用它来分割一个xts对象 - 将返回一个xts对象列表,其中每个组件的月份不同.split.xtsperiod.applyxtsendpointsendpointsxendpoints(x, "months")split.xtssplit(x, "months")

虽然,split.xts()并且endpoints()主要用于xts对象,但它们也可以用于其他一些对象,包括基于时间的矢量.即使您不想使用xts对象,您仍然可以找到用途,endpoints()因为它的便利性或速度(在C中实现)

> split.xts(as.Date("1970-01-01") + 1:10, "weeks")
[[1]]
[1] "1970-01-02" "1970-01-03" "1970-01-04"

[[2]]
[1] "1970-01-05" "1970-01-06" "1970-01-07" "1970-01-08" "1970-01-09"
[6] "1970-01-10" "1970-01-11"

> endpoints(as.Date("1970-01-01") + 1:10, "weeks")
[1]  0  3 10
Run Code Online (Sandbox Code Playgroud)

我认为lubridate在这个问题中的最佳用途是将"Date"字符串解析为POSIXct对象.即mdy_hms在这种情况下的功能.

这是一个用于解析"Date"字符串的xts解决方案lubridate.

x <- xts(bikecounts[, -1], mdy_hms(bikecounts$Date))
period.apply(x, endpoints(x, "days"), sum)
apply.daily(x, sum) # identical to above
Run Code Online (Sandbox Code Playgroud)

对于这个特定的任务,xts还有一个period.sum非常快的优化函数(用Fortran编写)

period.sum(x, endpoints(x, "days"))
Run Code Online (Sandbox Code Playgroud)