【问题标题】:R - time series hourlyR - 时间序列每小时
【发布时间】:2015-03-04 08:07:14
【问题描述】:

我有以下每天下午 3 点后来电的数据集。到晚上 10 点看起来像这样:

Date        hour  Count  Year  Month  Day
01.01.2001  15    69     2001  1      1
01.01.2001  16    12     2001  1      1
01.01.2001  17    56     2001  1      1
01.01.2001  18    34     2001  1      1
01.01.2001  19    44     2001  1      1
01.01.2001  20    91     2001  1      1
01.01.2001  21    82     2001  1      1
01.01.2001  22    49     2001  1      1
...
17.08.2003  22    103    2003  8      17

需要做的是时间序列分析,包括预测、指数平滑、移动平均等。

我现在面临的问题是如何声明 ts 函数?我只有下午 3 点到 10 点的高峰时段,所以我不能将频率声明为 24。

谁能帮帮我?

非常感谢 干杯,

【问题讨论】:

    标签: r time-series forecasting moving-average


    【解决方案1】:

    1) 假设系列从下午 3 点开始,那几天是连续的,并且从下午 3 点到晚上 10 点的所有时间都存在:

    tser <- ts(DF[-1], freq = 8)
    

    给予:

    > tser
    Time Series:
    Start = c(1, 1) 
    End = c(1, 8) 
    Frequency = 8 
          hour Count Year Month Day
    1.000   15    69 2001     1   1
    1.125   16    12 2001     1   1
    1.250   17    56 2001     1   1
    1.375   18    34 2001     1   1
    1.500   19    44 2001     1   1
    1.625   20    91 2001     1   1
    1.750   21    82 2001     1   1
    1.875   22    49 2001     1   1
    

    这将表示第 1 天 3pm 为 1.0,第 1 天 4pm 为 1+1/8,第 1 天 5pm 为 1+2/8,...,第 1 天 10pm 为 1+7/8,第 2 天的索引下午 3 点为 2,第 2 天下午 4 点为 2+1/8,等等。

    2) 相同,但天数从 1970-01-01 以来的天数开始,而不是从 1 开始:

    tser <- ts(DF[-1], start = as.Date("2001-01-01"), freq = 8)
    

    给予:

    > tser
    Time Series:
    Start = c(11323, 1) 
    End = c(11323, 8) 
    Frequency = 8 
             hour Count Year Month Day
    11323.00   15    69 2001     1   1
    11323.12   16    12 2001     1   1
    11323.25   17    56 2001     1   1
    11323.38   18    34 2001     1   1
    11323.50   19    44 2001     1   1
    11323.62   20    91 2001     1   1
    11323.75   21    82 2001     1   1
    11323.88   22    49 2001     1   1
    

    也就是说,这将表示每天自 1970 年 1 月 1 日以来的天数加上与以前一样的 0、1/8、...、7/8 小时数。

    如果您以后需要重新生成日期/时间,那么:

    library(chron)
    tt <- as.numeric(time(tser))
    as.chron(tt %/% 1) + (8 * tt%%1 + 15)/24
    

    给予:

    [1] (01/01/01 15:00:00) (01/01/01 16:00:00) (01/01/01 17:00:00)
    [4] (01/01/01 18:00:00) (01/01/01 19:00:00) (01/01/01 20:00:00)
    [7] (01/01/01 21:00:00) (01/01/01 22:00:00)
    

    3) 动物园如果让它们保持等间距并不重要,那么你可以试试这个:

    library(zoo)
    library(chron)
    z <- zoo(DF[-1], as.chron(format(DF$Date), "%d.%m.%Y") + DF$hour/24)
    

    给予:

    > z
                        hour Count Year Month Day
    (01/01/01 15:00:00)   15    69 2001     1   1
    (01/01/01 16:00:00)   16    12 2001     1   1
    (01/01/01 17:00:00)   17    56 2001     1   1
    (01/01/01 18:00:00)   18    34 2001     1   1
    (01/01/01 19:00:00)   19    44 2001     1   1
    (01/01/01 20:00:00)   20    91 2001     1   1
    (01/01/01 21:00:00)   21    82 2001     1   1
    (01/01/01 22:00:00)   22    49 2001     1   1
    

    动物园方法不需要所有时间都在场,也不需要天是连续的。

    注意:我不确定您是否真的需要单独拆分所有日期和时间字段,因为它们很容易动态生成,所以这可能就足够了。

    Count <- z$Count
    

    年可以通过as.numeric(format(time(Count), "%Y")) 恢复,月、日和小时可以通过使用%m%d%H 代替%Y 恢复。

    还可以使用month.day.year(time(Count)) 生成月、日和年列的列表。

    years(time(Count))months(time(Count))days(time(Count))hours(time(Count)) 将产生指定数量的因子。

    【讨论】:

    • 动物园的方法似乎很完美。奇怪的是,当打印 z DF 时,日期显示为 (NA NA)。这是一个已知问题吗?
    • 从输出中可以看出,它的打印正确。您必须做与答案中描述的不同的事情。
    • 知道了。只需将格式从 %d.%m.%Y 更改为 %d/%m/%Y。我应该如何绘制例如下午 3 点到 10 点的通话次数年/月/日?很抱歉用简单的问题打扰您,但我是 R 的新手。非常感谢
    • 我猜你只在下午 3 点到 10 点有电话,所以:ag &lt;- aggregate(z$Count, as.Date, sum); plot(ag)
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2017-06-05
    • 1970-01-01
    • 2021-05-17
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多