簡體   English   中英

將日期和時間的數據幀轉換為R中的時間序列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM