【问题标题】:15 Minute Period for Time Series时间序列的 15 分钟周期
【发布时间】:2016-11-08 18:58:53
【问题描述】:

我有下面的代码块,我试图通过将它加入到一个包含一整年所有分钟的时间序列来填充我的数据df_stuff 中缺少的分钟。我实际上想以 15 分钟的间隔而不是一分钟来汇总这些数据。有谁知道这样做的简单方法?我正在查看 xts 包中的to.minutes15,但我的 POSIXct 格式时间序列似乎有问题。

代码:

library("sqldf")

##Filling Gaps in time by minute
myTZ <- "America/Los_Angeles"
tseries <- seq(as.POSIXct("2015-01-01 00:00:00", tz=myTZ),
               as.POSIXct("2015-12-31 23:59:00", tz=myTZ), by="min")

df2 <- data.frame(SeqDateTime=tseries)
finaldf <- sqldf("select df2.SeqDateTime,
                  median(df_stuff.brooms) as broomsTot
                  from df2
                  left outer join df_stuff on df2.SeqDateTime = df_stuff.broomTime
                  group by df2.SeqDateTime
                  order by df2.SeqDateTime asc")

数据:

df_stuff <- structure(list(brooms = c(27, 53, 10, 55, 14, 49, 26, 
13, 12, NA, NA, 23, 28, 31, NA, 46, NA, 13, NA, 33, 12, 4, 28, 
34, 0, 24, 7, 31, 33, 37, 56, 41, 50, 55, 41, 15, 23, 26, 14, 
27, 22, 41, 48, 19, 28, 11, 11, NA, 49, NA), broomTime =   structure(c(1423970100, 
1424122200, 1424136180, 1424035260, 1424141580, 1424122440, 1423274580, 
1424129580, 1424146320, 1429129320, 1429032060, 1429142940, 1428705000, 
1429142460, 1429128720, 1429204560, 1422909480, 1424137200, 1424042100, 
1424149620, 1424131920, 1424108940, 1424144820, 1424040600, 1424119620, 
1424148660, 1443593040, 1443657120, 1424125860, 1424223120, 1424235240, 
1424232720, 1424234940, 1424234640, 1424230440, 1424115300, 1429208280, 
1429131720, 1429148460, 1429151040, 1424129760, 1424125380, 1424123220, 
1424137380, 1424115780, 1424219340, 1424131560, 1424233560, 1424224920, 
1443640800), class = c("POSIXct", "POSIXt"), tzone = "")), .Names =   c("brooms", 
"broomTime"), row.names = c(NA, 50L), class = "data.frame")

【问题讨论】:

  • 一种简单的方法是整数除法:df$timeCat &lt;- as.integer(df$broomTime) %/% 15 将分钟分成 15 分钟。

标签: r time-series xts


【解决方案1】:

您可以通过在dplyrgroup_by 函数中使用cut 来按任意时间间隔进行汇总。

library(dplyr)
ans <- finaldf %>% 
         group_by(SeqDateTime = cut(SeqDateTime, breaks = "15 min"))  %>% 
         summarize(broomsTot = sum(as.numeric(broomsTot), na.rm = TRUE))

head(ans)
Source: local data frame [6 x 2]

          SeqDateTime broomsTot
               (fctr)     (dbl)
1 2015-01-01 02:00:00         0
2 2015-01-01 02:15:00         0
3 2015-01-01 02:30:00         0
4 2015-01-01 02:45:00         0
5 2015-01-01 03:00:00         0
6 2015-01-01 03:15:00         0

【讨论】:

    【解决方案2】:

    我可以向您保证,xts 对您的 POSIXct 时间序列没有问题。 xts 使用 POSIXct 作为其内部时间索引。

    以下是如何将 df_stuff 加入 1 分钟系列,然后将结果汇总为 15 分钟系列。

    library(xts)
    # create xts object
    xts_stuff <- with(df_stuff, xts(brooms, broomTime))
    # merge with empty xts object that contains a regular 1-minute index
    xts_stuff_1min <- merge(xts_stuff, xts(,tseries))
    # aggregate to 15-minutes
    ep15 <- endpoints(xts_stuff_1min, "minutes", 15)
    final_df <- period.apply(xts_stuff_1min, ep15, median, na.rm=TRUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-26
      • 2021-01-06
      • 2017-08-26
      • 1970-01-01
      • 2021-01-08
      • 2012-05-12
      • 2021-07-18
      • 2018-06-02
      相关资源
      最近更新 更多