【问题标题】:Grouping time series data by combination of time and day of the week按时间和星期几的组合对时间序列数据进行分组
【发布时间】:2017-03-17 12:10:14
【问题描述】:

我有一个特定停车场的占用率数据,该数据持续了数周,时间间隔为 5 分钟。

我的数据如下:

head(DataParking)
           DateTime OccupancyRate Weekday
2017-01-27 10:24:41     0.2570423  Friday
2017-01-27 10:29:41     0.2605634  Friday
2017-01-27 10:34:41     0.2535211  Friday
2017-01-27 10:39:41     0.2535211  Friday
2017-01-27 10:44:41     0.2535211  Friday
2017-01-27 10:49:41     0.2535211  Friday

我想创建一个平均入住率和上下边界值的图,以显示每周的整体模式。因此,我的数据需要按一天中的时间和一周中的一天的组合进行分组。

最后,我希望我的数据如下所示:

        Time   Weekday  AvgOccupancyRate  MinOccupancyRate    MaxOccupancyRate
    10:24:41    Friday         0.2570423         0.1770423           0.3670423
    10:29:41    Friday         0.2605634         0.1810423           0.3560423
    10:34:41    Friday         0.2535211         0.1870423           0.3570423
    10:39:41    Friday         0.2535211         0.1770423           0.3570423
    10:44:41    Friday         0.2535211         0.1770423           0.3570423
    10:49:41    Friday         0.2535211         0.1870423           0.3870423

我怎样才能做到这一点?

另一个问题:有了这些数据,我可以绘制特定日期(例如星期五)的数据,这已经提供了一些见解。但是,如果我想绘制从周一 00:00 到周日 23:59 的每周模式,我想我需要一个 WeekdayTime 组合变量,它可以绘制在折线图的 x 轴上。您是否知道是否存在这种格式以及如何使用(例如)ggplot 在 x 轴上绘制工作日-时间组合?

非常感谢!

【问题讨论】:

  • 请一次问一个问题。
  • 一种快速提取时间的方法是使用format(as.POSIXct("2017-01-27 10:24:41"), "%H:%M:%S")。这应该在逻辑上排序,因为 0 在单个数字前(9:00:00 变为 09:00:00)。我认为chron 包可能具有以更智能的方式存储时间的功能。
  • 是的,我知道如何从 DateTime 变量中提取时间。但是如果我这样做,我的数据就不能按时间聚合,对吧?如果我使用as.POSIXct,在变量中的%H:%M:%S 下方,对应的日期总是会阻碍基于工作日的聚合,或者不是?

标签: r plot time-series aggregate


【解决方案1】:

要创建一个分组data.frame 来绘制您需要的内容,您可以执行以下操作:

library(dplyr)

df %>% 
    mutate(Time = format(DateTime, '%u %H:%M:%S')) %>% 
    group_by(Time, Weekday) %>% # Weekday is not really needed but can be clearer to read
    summarize(AvgOccRate = mean(OccupancyRate),
              MinOccRate = min(OccupancyRate),
              MaxOccRate = max(OccupancyRate)) -> res

这里的重要一点是format(DateTime, '%u %H:%M:%S') 这将创建一个新变量,%u 作为工作日,%H:%M:%S 作为时间。

然后情节使用沿线的东西:

library(ggplot2)

ggplot(res, aes(Time, group = 1)) +
    geom_line(aes(Time, AvgOccRate)) +
    geom_line(aes(Time, MinOccRate), alpha = .5) +
    geom_line(aes(Time, MaxOccRate), alpha = .5)

【讨论】:

  • 是否也可以计算 95% 置信区间的上限和下限,而不是特定工作日/时间组合的最小值或最大值?
【解决方案2】:

我只会回答你的第一个问题。

使用dplyr我们可以先创建时间和工作日,然后做一个简单的summarise。这是未经测试的,因为您的数据没有不同的组合。

library(dplyr)

DataParking %>%
  mutate(time = format(as.POSIXct(DateTime), "%H:%M:%S"),             # Thanks to @lmo
         weekday = lubridate::wday(DateTime, label = TRUE)) %>%
  group_by(time, weekday) %>%
  summarise(AvgOccupancyRate = mean(OccupancyRate),
            MinOccupancyRate = min(OccupancyRate),
            MaxOccupancyRate = max(OccupancyRate)) %>%
  select(-DateTime)

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    相关资源
    最近更新 更多