gpt4 book ai didi

r - lubridate 按时间段聚合

转载 作者:行者123 更新时间:2023-12-03 23:27:11 25 4
gpt4 key购买 nike

This question询问 R 中按时间段聚合的情况,pandas 称之为重采样。最有用的答案使用 XTS 包按给定的时间段进行分组,应用一些函数,例如 sum() 或 mean()。

其中一条评论表明 lubridate 中存在类似的内容,但没有详细说明。有人可以提供一个使用 lubridate 的惯用例子吗?我已经通读了几次 lubridate 小插图,可以想象 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")

数据如下所示:
> 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

最佳答案

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

tapply(bikecounts$Northbound, as.Date(bikecounts$Date, format="%m/%d/%Y"), sum)

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

lubridate 可用于为拆分应用问题创建分组因子。因此,例如,如果您想要每个月的总和(忽略年份)
tapply(bikecounts$Northbound, month(mdy_hms(bikecounts$Date)), sum)

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

Answer 未涵盖的内容到另一个 Question链接到 OP 是 split.xts . period.apply拆分 xtsendpoints并对每个组应用一个函数。您可以使用 endpoints 找到对给定任务有用的端点。功能。例如,如果您有一个 xts 对象, x ,然后 endpoints(x, "months")会给你每个月最后一行的行号。 split.xts利用它来拆分 xts 对象 -- split(x, "months")将返回 xts 对象的列表,其中每个组件用于不同的月份。

虽然, 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

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

这是一个 xts使用 lubridate 的解决方案解析“日期”字符串。
x <- xts(bikecounts[, -1], mdy_hms(bikecounts$Date))
period.apply(x, endpoints(x, "days"), sum)
apply.daily(x, sum) # identical to above

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

关于r - lubridate 按时间段聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18046184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com