2017-03-17 149 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)