【问题标题】:How to create a time series of hourly data?如何创建每小时数据的时间序列?
【发布时间】:2023-07-28 03:22:01
【问题描述】:

我有每小时值的数据。

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

【问题讨论】:

  • 严格来说,你已经有了时间序列。你可以查看包裹xts
  • @Pascal:他们可能指的是ts 对象,该对象的构造函数具有startendfrequency 参数。
  • @JoshuaUlrich 是的,当然。
  • 您可以将日期和时间列强制转换为 POSIXct 对象data$dateTime = as.POSIXct(paste(data$Date,data$Hour), format = "%Y-%m-%d %H:%M:%S"),然后您可以使用以下内容创建时间序列对象:data$ts = ts(ts = data$dateTime, start = data$dateTime[1], end = data$dateTime[nrow(data)])
  • @ColinCharles 您给出的 ts 函数中的频率 arg 是多少?这些是每小时的电力值,分布在 4 年内。我想观察季节性、趋势等,所以会在没有频率参数的情况下分解工作吗?

标签: r time-series


【解决方案1】:

下面是如何使用基础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)

【讨论】:

  • 这不处理闰年。怎么做见here
【解决方案2】:
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)

【讨论】:

    【解决方案3】:

    第 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 现已准备就绪

    【讨论】:

      【解决方案4】:

      我会使用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 
      

      【讨论】:

        【解决方案5】:

        这个怎么样:

        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
        

        【讨论】:

        • 我在 R 中得到这个 Date x 1 1164934800 -1.8954203 2 1164938400 -1.4847575 3 1164942000 1.1840722 日期列中的那些值是什么?它们是自 1970 年以来的秒数(R 中的默认日期或类似的日期)?
        • 我编辑了答案,现在我使用 zooas.zoo 将 data.frame 转换为时间序列对象。显然,ts 不喜欢 POSIXct-objects 作为日期......很奇怪。
        【解决方案6】:

        一些答案​​没有考虑闰年,包括最受好评的。请参阅 Rob Hyndman,了解如何在 R 中定义每小时时间序列(herehere):

        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))
        

        【讨论】:

          最近更新 更多