【问题标题】:Hourly time series in RR中的每小时时间序列
【发布时间】:2018-03-10 10:22:20
【问题描述】:

我有 POSIXct 格式的样本时间数据(如下),但无法使用 ts() 将其转换为每小时时间序列。

> dat
 [1] "2017-09-25 07:34:53 EDT" "2017-09-25 07:56:43 EDT" "2017-09-25 08:33:40 EDT"
 [4] "2017-09-25 08:34:24 EDT" "2017-09-25 08:43:33 EDT" "2017-09-25 09:34:53 EDT"
 [7] "2017-09-25 09:36:07 EDT" "2017-09-25 09:40:50 EDT" "2017-09-25 10:19:12 EDT"
[10] "2017-09-25 10:22:03 EDT" "2017-09-25 10:27:01 EDT" "2017-09-25 10:35:01 EDT"
[13] "2017-09-25 11:09:54 EDT" "2017-09-25 11:17:37 EDT" "2017-09-25 11:18:25 EDT"
[16] "2017-09-25 11:59:50 EDT" "2017-09-25 12:38:06 EDT" "2017-09-25 12:41:41 EDT"
[19] "2017-09-25 13:02:44 EDT" "2017-09-25 13:17:23 EDT" "2017-09-25 13:30:40 EDT"
[22] "2017-09-25 13:42:03 EDT" "2017-09-25 13:56:27 EDT" "2017-09-25 14:23:59 EDT"
[25] "2017-09-25 15:42:51 EDT"

我的目标是随后用dygraph() 显示这个每小时的时间序列。在下面的示例中,我使用以下代码生成了一个按天计算的时间序列:

trips <- as.data.frame(matrix(ncol=1, nrow=30))
colnames(trips) <- c("count")
trips$count <-  floor(runif(30, min=50, max=101))
z <- zoo(trips, seq(from = as.Date("2017-09-01"), to = as.Date("2017-09-30"), by = 1))

z <- as.ts(z)

dygraph(z, main = "Daily Trips") 

在知道第一条记录和结束记录之间的小时差的情况下,如何正确地将 POSIXct 转换为每小时时间序列?

这里是示例数据:

> dput(dat)
structure(c(1506339293, 1506340603, 1506342820, 1506342864, 1506343413, 
1506346493, 1506346567, 1506346850, 1506349152, 1506349323, 1506349621, 
1506350101, 1506352194, 1506352657, 1506352705, 1506355190, 1506357486, 
1506357701, 1506358964, 1506359843, 1506360640, 1506361323, 1506362187, 
1506363839, 1506368571), class = c("POSIXct", "POSIXt"), tzone = "")

【问题讨论】:

  • 是来自特定库的tz
  • 是的,来自lubridate
  • 您的预期输出是什么?根据我从tz 读到的内容,这将获取或设置时区,而不是从中创建系列
  • 我的预期输出是按小时对数据进行分组的时间序列 - 我将 tz() 更改为 ts()
  • 编辑后的答案有帮助吗?

标签: r time time-series zoo


【解决方案1】:

可能是这样的:

z = ts(dat, start =1, end =8, frequency = 1)
class(z) <- c("POSIXct", "POSIXt")
#[1] "2017-09-25 13:34:53 GMT" "2017-09-25 13:56:43 GMT" "2017-09-25 14:33:40 GMT" "2017-09-25 14:34:24 GMT" "2017-09-25 14:43:33 GMT" "2017-09-25 15:34:53 GMT" "2017-09-25 15:36:07 GMT" "2017-09-25 15:40:50 GMT"

再试一次:

seq(from =dat[1], to = dat[length(dat)], by ='hour')
#[1] "2017-09-25 13:34:53 GMT" "2017-09-25 14:34:53 GMT" "2017-09-25 15:34:53 GMT" "2017-09-25 16:34:53 GMT" "2017-09-25 17:34:53 GMT" "2017-09-25 18:34:53 GMT" "2017-09-25 19:34:53 GMT" "2017-09-25 20:34:53 GMT" "2017-09-25 21:34:53 GMT"

第二个长度为 9,在原始 dat 中每个唯一小时一个

第三个选项:

library(lubridate)
library(data.table)

df = data.frame(timestamps = dat, bases = floor_date(dat, 'hour'))

setDT(df)
graph = df[,.N, by = bases]
dygraph(graph)

这将给出以下 dygraph:

【讨论】:

  • 是的,但数据应该是按小时分组的时间序列
  • 按小时分组是什么意思?每个唯一小时一个值?
  • @the_darkside 你有 9 个独特的小时,你会消除哪个小时?
  • 我不会消除任何时间,那就是 9 小时
  • 是的,谢谢,但这不会产生按唯一时间分组或显示在 dygraph() 上的时间序列,我将在我的问题中解释
猜你喜欢
  • 2015-03-04
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多