【问题标题】:Averaging by time intervals for preceding 5-min bin from datetime从日期时间开始按时间间隔平均前 5 分钟的 bin
【发布时间】:2014-01-26 09:09:01
【问题描述】:

我很欣赏那里有类似的问题,但是,我似乎无法为我的查询找到正确的答案。我有一个数据集,我想根据我的时间戳以 5 分钟的间隔对一列中的数据进行平均,平均从一小时开始,例如,在前 5 分钟的 10:00 平均将是 09:56-10:00。

这是我的数据集的示例:

data <- structure(list(datetime = c("11/07/2013 19:20", "11/07/2013 19:21", 
"11/07/2013 19:22", "11/07/2013 19:23", "11/07/2013 19:24", "11/07/2013 19:25", 
"11/07/2013 19:26", "11/07/2013 19:27", "11/07/2013 19:28", "11/07/2013 19:29", 
"11/07/2013 19:30", "11/07/2013 19:31", "11/07/2013 19:32", "11/07/2013 19:33", 
"11/07/2013 19:34", "11/07/2013 19:35", "11/07/2013 19:36", "11/07/2013 19:37", 
"11/07/2013 19:38", "11/07/2013 19:39", "11/07/2013 19:40", "11/07/2013 19:41", 
"11/07/2013 19:42", "11/07/2013 19:43", "11/07/2013 19:44", "11/07/2013 19:45"
), met = c(-24.24081371, -24.4280008, -24.35142264, -24.84884114, 
-25.06214408, -25.46749039, -25.44670288, -25.86062294, -26.30899817, 
-26.57565791, -26.6866101, -27.03829228, -27.34621325, -27.91269122, 
-28.60861612, -29.16745075, -28.81285096, -29.89737508, -30.26500716, 
-30.08502411, -31.05084494, -31.21356991, -31.05715444, -32.29645243, 
-32.76946492, -32.69307397)), .Names = c("datetime", "met"),
class = "data.frame", row.names = c(NA, -26L))

我已经尝试了下面的代码,但我无法让它按照我想要的方式工作。

> data$datetime <- as.POSIXct(data$datetime, format="%m/%d/%Y %H:%M")
> groups <- cut(data$datetime, breaks="5 min")
> by(data$met, groups, mean)
groups: 2013-07-11 19:20:00
[1] -24.58624
------------------------------------------------------------------------ 
groups: 2013-07-11 19:25:00
[1] -25.93189
------------------------------------------------------------------------ 
groups: 2013-07-11 19:30:00
[1] -27.51848
------------------------------------------------------------------------ 
groups: 2013-07-11 19:35:00
[1] -29.64554
------------------------------------------------------------------------ 
groups: 2013-07-11 19:40:00
[1] -31.6775
------------------------------------------------------------------------ 
groups: 2013-07-11 19:45:00
[1] -32.69307

这些是正确的平均值,但时间戳是 5 分钟期间的第一个时间戳而不是最后一个,因此 R 给出的 12:01 实际上是 12:05(从 12:01 到 12:05 )。不幸的是,我似乎无法将输出转换为 12/07/2013 12:05 -19.91691 这样的格式。

【问题讨论】:

  • 所以data$datetime &lt;- as.POSIXct(data$datetime, format="%m/%d/%Y %H:%M"); (groups &lt;- cut(data$datetime, breaks="5 min")) 并不是您想要的,对吧?
  • 感谢您的评论,我已经使用了 data$datetime &lt;- as.POSIXct(data$datetime, format="%m/%d/%Y %H:%M")(groups &lt;- cut(data$datetime, breaks="5 min")met.5min &lt;- by(data$met.day.night, groups, mean),但是,它的间隔不正确,它位于我不知道如何导出的数据框中(请原谅我的无知!)。
  • 请提供预期的输出。目前尚不清楚您是想要数据中每个点的 5 分钟平均值,还是想要聚合以便每 5 分钟只有一次观察。
  • 例如(日期不同),目前我有输出:groups: 2013-07-14 12:01:00 [1] -19.91691 groups: 2013-07-14 12:06:00 [1] -20.05351 groups: 2013-07-14 12:11:00 [1] -18.89263 这些是正确的平均值,但时间戳是 5 分钟期间的第一个时间戳,而不是最后一个,所以 R 给出的 12:01 实际上是 12:05(从 12:01 到 12:05 的时间段)。不幸的是,我似乎无法将输出转换为 12/07/2013 12:05 -19.91691 这样的格式
  • 这本质上是Timeseries average based on a defined time interval (bin) 的复制品,其答案是更好的成语(cut 不是最人性化的功能)。这个问题唯一不同的是需要从日期时间中提取 5 分钟的 bin。

标签: r timestamp time-series date-arithmetic binning


【解决方案1】:

处理时间序列的最佳解决方案是首先使用现有的或实现时间序列处理例程库,这通常允许进行此类聚合。我不会在每个案例的基础上一次又一次地写这些东西。在我之前的角色中,我正在推动这样一个库的实现,但是,它是专有的。因此提示:

  • 使用split 在每小时的最后/第一分钟拆分data$met(这些行的索引可以通过具有基本 R 知识的时间戳轻松获得)
  • 在结果中使用sapply 与任意聚合函数,例如平均最后 5 个值
  • 将结果放入具有与拆分时相同的索引的时间序列中

话虽如此,您最好编写一个时间序列处理库来提供 C 中的通用聚合例程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2017-03-17
    • 2018-02-12
    • 2021-07-16
    相关资源
    最近更新 更多