2017-07-09 137 views
0

我有兩個半年的月數據。我想將我的數據幀轉換爲時間序列。所以我應該有將數據幀轉換爲R中的時間序列

Start :: 2015-01-01 

End :: 2017-06-01 

Frequency : 1 

我已經試過

ts (df [, -1], start = df [1, 1], end = df [29, 1]) 

但我從中得到這真的有線輸出。

Time Series: 
    Start = 16436 
    End = 17287 
    Frequency = 1 

      date inflow 
    1 2015-01-01 6434 

    2 2015-02-01 5595 

    3 2015-03-01 3101 

    4 2015-04-01 3475 

    5 2015-05-01 6519 

    6 2015-06-01 7251 

    7 2015-07-01 4200 

    8 2015-08-01 3622 

    9 2015-09-01 4782 

    10 2015-10-01 6503 

    11 2015-11-01 9460 

    12 2015-12-01 15623 

    13 2016-01-01 18393 

    14 2016-02-01 14410 

    15 2016-03-01 11210 

    16 2016-04-01 10582 

    17 2016-05-01 14316 

    18 2016-06-01 11876 

    19 2016-07-01 13676 

    20 2016-08-01 12466 

    21 2016-09-01 17326 

    22 2016-10-01 15845 

    23 2016-11-01 15569 

    24 2016-12-01 24933 

    25 2017-01-01 35050 

    26 2017-02-01 26008 

    27 2017-03-01 25767 

    28 2017-04-01 17858 

    29 2017-05-01 21089 



dput(df) 
structure(list(date = structure(c(16436, 16467, 16495, 16526, 
16556, 16587, 16617, 16648, 16679, 16709, 16740, 16770, 16801, 
16832, 16861, 16892, 16922, 16953, 16983, 17014, 17045, 17075, 
17106, 17136, 17167, 17198, 17226, 17257, 17287, 17318), class = "Date"), 
    inflow = c(6434L, 5595L, 3101L, 3475L, 6519L, 7251L, 4200L, 
    3622L, 4782L, 6503L, 9460L, 15623L, 18393L, 14410L, 11210L, 
    10582L, 14316L, 11876L, 13676L, 12466L, 17326L, 15845L, 15569L, 
    24933L, 35050L, 26008L, 25767L, 17858L, 21089L, 13570L)), row.names = c(NA, 
-30L), class = "data.frame", .Names = c("date", "inflow")) 

非常感謝提前!

回答

1

1)動物園可能最簡單的就是將它轉換爲"zoo"類,並從那個類轉換爲"ts"類。 "yearmon" class是動物園包中提供的一類,用於表示月度數據,並且與ts中的頻率12數據非常接近。結果是"ts"類系列具有與df中的行數相同的長度。

library(zoo) 
as.ts(read.zoo(df, FUN = as.yearmon)) 

##  Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
## 2015 6434 5595 3101 3475 6519 7251 4200 3622 4782 6503 9460 15623 
## 2016 18393 14410 11210 10582 14316 11876 13676 12466 17326 15845 15569 24933 
## 2017 35050 26008 25767 17858 21089 13570 

取決於你想做的事,你可能更願意只把它作爲在這種情況下省略as.ts一個"zoo"類的時間序列什麼。

1A)使用動物園的另一種方法將是:

ts(df$inflow, start = as.yearmon(df$date[1]), freq = 12) 

2)基這是更長的但不使用任何包:

mo <- as.numeric(format(df$date[1], "%m")) 
yr <- as.numeric(format(df$date[1], "%Y")) 
ts(df$inflow, start = c(yr, mo), freq = 12) 

如果它被稱爲該系列始終在1月份開始,那麼我們可以省略mo的定義並編寫:

ts(df$inflow, start = yr, freq = 12) 

注:從問題的輸入df是:

df <- 
structure(list(date = structure(c(16436, 16467, 16495, 16526, 
16556, 16587, 16617, 16648, 16679, 16709, 16740, 16770, 16801, 
16832, 16861, 16892, 16922, 16953, 16983, 17014, 17045, 17075, 
17106, 17136, 17167, 17198, 17226, 17257, 17287, 17318), class = "Date"), 
inflow = c(6434L, 5595L, 3101L, 3475L, 6519L, 7251L, 4200L, 
3622L, 4782L, 6503L, 9460L, 15623L, 18393L, 14410L, 11210L, 
10582L, 14316L, 11876L, 13676L, 12466L, 17326L, 15845L, 15569L, 
24933L, 35050L, 26008L, 25767L, 17858L, 21089L, 13570L)), row.names = 
c(NA, 30L), class = "data.frame", .Names = c("date", "inflow")) 
1

你的29應該是30,因爲你有效地切斷的最後日期。代替對最後一行編號進行硬編碼,最好用一個函數替換它,例如:

ts (df [, -1], start = df [1, 1], end = df [nrow (df), 1])