2017-03-17 100 views
0

我有一段时间间隔为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轴的平日组合?

非常感谢提前!

+3

请一次问一个问题。 – Axeman

+1

提取时间的一种快速方法是使用'format(as.POSIXct(“2017-01-27 10:24:41”),“%H:%M:%S”)''。这应该在逻辑上进行排序,因为0被预置为单个数字(9:00:00变为09:00:00)。我认为'chron'软件包可以有更多智能的存储时间。 – lmo

+0

是的,我知道如何从DateTime变量中提取时间。但是,如果我这样做,我的数据不能根据时间汇总,对吧?如果我在变量中的'%H:%M:%S'下使用'as.POSIXct',相应的日期将总是妨碍基于工作日的聚合,或者不是? – Robert

回答

0

创建分组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) 
+0

也可以计算95%置信区间的上限和下限,而不是特定的周日/时间组合的最小值或最大值? – Robert

0

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

使用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)