【问题标题】:aggregating 15minute time series data to daily将 15 分钟的时间序列数据汇总到每日
【发布时间】:2012-06-25 05:54:09
【问题描述】:

这是我的文本文件中的数据:(我显示了 10,000 行中的 10 行) index 是行名,temp 是时间序列,m 是以 mm 为单位的值。

     "Index" "temp" "m"
   1 "2012-02-07 18:15:13" "4297"
   2 "2012-02-07 18:30:04" "4296"
   3 "2012-02-07 18:45:10" "4297"
   4 "2012-02-07 19:00:01" "4297"
   5 "2012-02-07 19:15:07" "4298"
   6 "2012-02-07 19:30:13" "4299"
   7 "2012-02-07 19:45:04" "4299"
   8 "2012-02-07 20:00:10" "4299"
   9 "2012-02-07 20:15:01" "4300"
   10 "2012-02-07 20:30:07" "4301"

我使用这个在 r 中导入:

    x2=read.table("data.txt", header=TRUE)

我尝试使用以下代码将时间序列汇总为每日数据:

   c=aggregate(ts(x2[, 2], freq = 96), 1, mean)

我已将频率设置为 96,因为 15 分钟的数据 24 小时将包含在 96 个值中。

它返回给我:

    Time Series:
   Start = 1 
   End = 5 
   Frequency = 1 
   [1] 5366.698 5325.115 5311.969 5288.542 5331.115

但我想要与原始数据相同的格式,即我还想要值旁边的时间序列。 我需要帮助来实现这一目标。

【问题讨论】:

  • 请做一个可重现的例子:stackoverflow.com/questions/5963269/…
  • 我已经编辑了我的问题。如果您需要更多信息,请告诉我。
  • 也许您应该先将数据读入数据框,然后再输入内容。
  • @John- 很抱歉,但 dput 会产生很长的输出,我认为它没有用。您可以复制我的文本文件的内容并使用它。
  • @andrie-您可以将我提供的数据复制粘贴到文本文件中并使用该文本文件。我尝试使用 dput() 但它产生了很长的输出。请在这里帮助我

标签: r time-series zoo


【解决方案1】:

将数据转换为xts 对象后,使用xts 包中的apply.daily

这样的事情应该可以工作:

x2 = read.table(header=TRUE, text='     "Index" "temp" "m"
1 "2012-02-07 18:15:13" "4297"
2 "2012-02-07 18:30:04" "4296"
3 "2012-02-07 18:45:10" "4297"
4 "2012-02-07 19:00:01" "4297"
5 "2012-02-07 19:15:07" "4298"
6 "2012-02-07 19:30:13" "4299"
7 "2012-02-07 19:45:04" "4299"
8 "2012-02-07 20:00:10" "4299"
9 "2012-02-07 20:15:01" "4300"
10 "2012-02-07 20:30:07" "4301"')

x2$temp = as.POSIXct(strptime(x2$temp, "%Y-%m-%d %H:%M:%S"))
require(xts)
x2 = xts(x = x2$m, order.by = x2$temp)
apply.daily(x2, mean)
##                       [,1]
## 2012-02-07 20:30:07 4298.3

更新:您的问题采用可重现的格式(使用虚假数据)

我们并不总是需要实际的数据集来帮助解决问题......

set.seed(1) # So you can get the same numbers as I do
x = data.frame(datetime = seq(ISOdatetime(1970, 1, 1, 0, 0, 0), 
                              length = 384, by = 900), 
               m = sample(2000:4000, 384, replace = TRUE))
head(x)
#              datetime    m
# 1 1970-01-01 00:00:00 2531
# 2 1970-01-01 00:15:00 2744
# 3 1970-01-01 00:30:00 3146
# 4 1970-01-01 00:45:00 3817
# 5 1970-01-01 01:00:00 2403
# 6 1970-01-01 01:15:00 3797
require(xts)
x2 = xts(x$m, x$datetime)
head(x2)
#                     [,1]
# 1970-01-01 00:00:00 2531
# 1970-01-01 00:15:00 2744
# 1970-01-01 00:30:00 3146
# 1970-01-01 00:45:00 3817
# 1970-01-01 01:00:00 2403
# 1970-01-01 01:15:00 3797
apply.daily(x2, mean)
#                         [,1]
# 1970-01-01 23:45:00 3031.302
# 1970-01-02 23:45:00 3043.250
# 1970-01-03 23:45:00 2896.771
# 1970-01-04 23:45:00 2996.479

更新 2:替代方法

(使用我在上述更新中提供的虚假数据。)

data.frame(time = x[seq(96, nrow(x), by=96), 1],
           mean = aggregate(ts(x[, 2], freq = 96), 1, mean))
#               time     mean
# 1 1970-01-01 23:45 3031.302
# 2 1970-01-02 23:45 3043.250
# 3 1970-01-03 23:45 2896.771
# 4 1970-01-04 23:45 2996.479

【讨论】:

    【解决方案2】:

    这将是在基础 R 中执行此操作的一种方法:

    x2 <- within(x2, {
       temp <- as.POSIXct(temp, format='%Y-%m-%d %H:%M:%S')
       days <- as.POSIXct(cut(temp, breaks='days'))
       m <- as.numeric(m)
    })
    
    with(x2, aggregate(m, by=list(days=days), mean))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 2017-08-26
      • 2011-07-09
      • 1970-01-01
      • 2021-01-06
      • 2017-08-26
      • 2019-10-29
      • 2011-08-28
      相关资源
      最近更新 更多