[英]Converting dataframe with date and time to time series in R
我有一個包含13列的數據框,我希望將該數據框轉換為時間序列,以便可以使用stl()
執行季節性分解
我的數據框如下所示:
> head(wideRawDF)
Period.Start.Time DO0182U09A3 DO0182U09B3 DO0182U09C3 DO0182U21A1 DO0182U21A2 DO0182U21A3
1 2017-01-20 16:30:00 -101.50 -103.37 -103.86 -104.78 -104.95 -105.33
2 2017-01-20 16:45:00 -101.32 -102.75 -104.22 -104.51 -103.94 -105.29
3 2017-01-20 17:00:00 -101.45 -103.30 -103.93 -104.70 -104.82 -105.13
4 2017-01-20 17:15:00 -100.91 -95.92 -99.22 -103.83 -104.72 -105.19
5 2017-01-20 17:30:00 -100.91 -103.04 -104.09 -102.15 -104.91 -105.18
6 2017-01-20 17:45:00 -100.97 -103.67 -104.12 -105.07 -104.23 -97.48
DO0182U21B1 DO0182U21B2 DO0182U21B3 DO0182U21C1 DO0182U21C2 DO0182U21C3
1 -102.50 -99.43 -104.05 -104.51 -104.42 -105.17
2 -102.82 -101.99 -103.94 -104.74 -104.65 -105.25
3 -103.72 -103.95 -104.25 -105.02 -105.04 -105.32
4 -103.57 -101.36 -104.09 -103.90 -102.95 -105.16
5 -103.88 -104.09 -103.96 -104.75 -105.07 -105.23
6 -103.92 -103.89 -104.01 -105.08 -105.14 -104.89
如您所見,我的數據間隔為15分鍾。
我嘗試使用以下代碼將其轉換為時間序列:
wideRawTS <- as.ts(wideRawDF, start = head(index(wideRawDF), 1), end = tail(index(wideRawDF), 1), frequency = 1)
我使用等於1的頻率,因為我有1343行數據,每行代表一個采樣周期。
1343 /(14 * 24 * 4)= 0.999 => 1
wideRawTS如下所示:
head(wideRawTS)
Period.Start.Time DO0182U09A3 DO0182U09B3 DO0182U09C3 DO0182U21A1 DO0182U21A2 DO0182U21A3 DO0182U21B1 DO0182U21B2 DO0182U21B3
[1,] 1484929800 -101.50 -103.37 -103.86 -104.78 -104.95 -105.33 -102.50 -99.43 -104.05
[2,] 1484930700 -101.32 -102.75 -104.22 -104.51 -103.94 -105.29 -102.82 -101.99 -103.94
[3,] 1484931600 -101.45 -103.30 -103.93 -104.70 -104.82 -105.13 -103.72 -103.95 -104.25
[4,] 1484932500 -100.91 -95.92 -99.22 -103.83 -104.72 -105.19 -103.57 -101.36 -104.09
[5,] 1484933400 -100.91 -103.04 -104.09 -102.15 -104.91 -105.18 -103.88 -104.09 -103.96
[6,] 1484934300 -100.97 -103.67 -104.12 -105.07 -104.23 -97.48 -103.92 -103.89 -104.01
DO0182U21C1 DO0182U21C2 DO0182U21C3
[1,] -104.51 -104.42 -105.17
[2,] -104.74 -104.65 -105.25
[3,] -105.02 -105.04 -105.32
[4,] -103.90 -102.95 -105.16
[5,] -104.75 -105.07 -105.23
[6,] -105.08 -105.14 -104.89
我相信Period.Start.Time變量已轉換為epoch,表示從1970年1月1日起的秒數的unix表示。
我隨后嘗試將時間序列數據wideRawTS傳遞給stl(),但現在得到:
stl(wideRawTS[,2])
Error in stl(wideRawTS[, 2]) :
series is not periodic or has less than two periods
我已經檢查了前幾個時期值,它們是原始數據的正確表示,所以我不知道發生了什么!
如果有人願意向我展示自己的錯誤,我將不勝感激。
似乎您在指定數據頻率方面遇到問題,請看此處 , 此處和此處 ,也許會有所幫助。
另外,使用xts包進行時間序列操縱不是一種選擇嗎?
library(xts)
Sys.setenv(TZ='GMT')
df <- read.table(sep = ",", header = TRUE, stringsAsFactors = FALSE, text = '
Period.Start.Time,DO0182U09A3,DO0182U09B3,DO0182U09C3,DO0182U21A1,DO0182U21A2,DO0182U21A3\n
"2017-01-20 16:30:00",-101.50,-103.37,-103.86,-104.78,-104.95,-105.3\n
"2017-01-20 16:45:00",-101.32,-102.75,-104.22,-104.51,-103.94,-105.29\n
"2017-01-20 17:00:00",-101.45,-103.30,-103.93,-104.70,-104.82,-105.13\n
"2017-01-20 17:15:00",-100.91,-95.92,-99.22,-103.83,-104.72,-105.19\n
"2017-01-20 17:30:00",-100.91,-103.04,-104.09,-102.15,-104.91,-105.18\n
"2017-01-20 17:45:00",-100.97,-103.67,-104.12,-105.07,-104.23,-97.48
')
df2 <- xts(x = df[,-1], order.by = as.POSIXct(df[,1]))
它適用於具有相同行數的偽數據。
dummy <- xts(x = rnorm(1343), order.by = as.POSIXct("2017-01-20 16:30:00") + 15*60*(1:1343))
stl(ts(as.numeric(index(dummy)), frequency=12), s.window="periodic", robust=TRUE)
Components
seasonal trend remainder
Jan 1 -1.165038e-07 1484930700 -2.145767e-06
Feb 1 2.053829e-07 1484931600 -1.192093e-06
Mar 1 -2.190031e-08 1484932500 2.384186e-07
Apr 1 -1.643545e-07 1484933400 7.152557e-07
May 1 -5.919005e-09 1484934300 9.536743e-07
Jun 1 1.653720e-07 1484935200 2.384186e-07
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.