簡體   English   中英

如何創建每小時數據的時間序列?

[英]How to create a time series of hourly data?

我有每小時值的數據。

SNo Date       Hour     X
1   2006-12-17 00:00:00 1.8824667
2   2006-12-17 01:00:00 3.3494000
3   2006-12-17 02:00:00 1.5872667
4   2006-12-17 03:00:00 1.6622000
5   2006-12-17 04:00:00 2.2157667
6   2006-12-17 05:00:00 1.9967333
7   2006-12-17 06:00:00 1.3033000
8   2006-12-17 07:00:00 1.6200333
9   2006-12-17 08:00:00 1.8905667
10  2006-12-17 09:00:00 2.5490667
11  2006-12-17 10:00:00 3.6289000

我將如何創建一個時間序列? 頻率和開始/結束參數是什么?

最后的日期和時間是

2010-11-26 21:00:00

library(lubridate)
NoOfHours <- as.numeric(ymd_hms("2010-11-26 21:00:00") - ymd_hms("2006-12-01 00:00:00"))*24 
ymd_hms("2006-12-01 00:00:00") + hours(0:NoOfHours)

這是在基數R使用ts()函數的方法(假設數據X包含在數據框dat )。 你需要指定的第一年,小時start (你不需要end ),並且frequency將在一年內的小時數。

firstHour <- 24*(as.Date("2006-12-17 00:00:00")-as.Date("2006-1-1 00:00:00"))
tt <- ts(dat$X,start=c(2006,firstHour),frequency=24*365)

這個怎么樣:

df <- data.frame(Date = rep("2006-12-01", 10),
                 Time = paste0(1:10, ":00:00"),
                 x = rnorm(10))

library(zoo)
df$Date <- as.POSIXct(paste(df$Date, df$Time), "GMT")
as.zoo(df[, c("Date", "x")])

# Date                x         
# 1  2006-12-01 01:00:00 -0.1386150
# 2  2006-12-01 02:00:00  1.8828398
# 3  2006-12-01 03:00:00  0.8736687
# 4  2006-12-01 04:00:00 -0.9145971
# 5  2006-12-01 05:00:00 -1.2449176
# 6  2006-12-01 06:00:00 -0.3599822
# 7  2006-12-01 07:00:00  1.3287747
# 8  2006-12-01 08:00:00  0.2926791
# 9  2006-12-01 09:00:00 -0.7015052
# 10 2006-12-01 10:00:00  0.8822346

我將使用zoo包和方便的read.zoo函數read.zoo來創建時間序列。

library(zoo)
## if you have a file input replace text= by filename
x.zoo <- read.zoo(text="SNo Date   Hour     X 
1   2006-12-17 00:00:00 1.8824667
2   2006-12-17 01:00:00 3.3494000
3   2006-12-17 02:00:00 1.5872667
4   2006-12-17 03:00:00 1.6622000
5   2006-12-17 04:00:00 2.2157667
6   2006-12-17 05:00:00 1.9967333
7   2006-12-17 06:00:00 1.3033000
8   2006-12-17 07:00:00 1.6200333
9   2006-12-17 08:00:00 1.8905667
10  2006-12-17 09:00:00 2.5490667
11  2006-12-17 10:00:00 3.6289000",index=c(2,3),tz="",
header=TRUE)

然后很容易將其強制為ts對象:

as.ts(x.zoo)
Time Series:
Start = 1166310000 
End = 1166346000 
Frequency = 0.000277777777777778 

步驟1:您需要以POSIXct格式連接Date和Hour列:

df$Date <- as.POSIXct(paste(df$Date, df$Time))

第2步:由於此數據是每小時的時間序列,因此您應該將其轉換為xts對象,因為xts比ts更好地處理每小時數據。 order.by是具有時間觀測值的列的值。

df <- as.xts(df, order.by = df$Date)

您的每小時時間序列數據df現已准備就緒

一些答案沒有考慮閏年,包括投票最多的。 有關如何在 R 中定義每小時時間序列的信息,請參閱 Rob Hyndman(此處此處):

firstHour <- 24*(as.Date("2006-12-17 00:00:00")-as.Date("2006-1-1 00:00:00")) # As suggested by Mark S
tt <- ts(dat$X,start=c(2006,firstHour),frequency=24*365.25)

所以頻率應該是365.25*24而不是365*24 如果我們談論年度期間,情況確實如此。 我們也可以談論幾周內的每小時時間序列,這會將頻率更改為7*24 我們可以使用msts處理多個季節性時期:

library(forecast)
msts(x, seasonal.periods= c(7*24, 365.25*24))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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