【问题标题】:How to split a chron date & time object in zoo for aggregation如何在动物园中拆分 chron 日期和时间对象以进行聚合
【发布时间】:2010-01-25 19:26:49
【问题描述】:

我已将数据以五分钟的间隔导入动物园对象,其中索引是带有日期和时间的 chron:

> d (09/09/09 16:45:10) 13.2 5.8 (09/09/09 16:50:10) 8.3 0.7 (09/09/09 16:55:10) 4.7 0.7 (09/09/09 17:00:10) 6.6 0.7 (09/09/09 17:05:10) 4.6 0.7

我正在尝试按四分之一小时间隔汇总。

我通过转换回字符串找到了这样做的方法,但输出不再是动物园。

> r =data.frame(聚合(d,trunc(chron(times=substr(as.character(index(d)),11,18)),,"00:15:00"), 意思) > r 00:00:00 0.5644444 00:15:00 0.5400000 00:30:00 0.5488889 00:45:00 0.6155556 01:00:00 0.3422222

虽然我可以绘制此图,但我试图在本地进行此操作。我发现与 zoo 的聚合可以做日和小时,但我不能细分小时。

【问题讨论】:

    标签: r


    【解决方案1】:

    我不相信 zoo 或 chron 内置有任何方法可以做到这一点,但您可以通过使用一点数学来创建自己的函数。给你:

    trunc.minutes <- function (x, n.minutes) 
    {
        if (!inherits(x, "times")) 
            x <- as.chron(x)
        x <- as.numeric(x)
        sec <- round(24 * 3600 * abs(x - floor(x)))
        h <- (sec%/%(n.minutes*60))/(60/n.minutes)
        hour <- as.integer(h)
        minutes <- (h %% hour) * 60
        chron(dates=chron::dates(x), times=times(paste(hour, minutes, "00", sep=":")))
    }
    

    这是一个用法示例:

    dts <- chron::dates(c("02/27/92", "02/27/92", "01/14/92",
                    "02/28/92", "02/01/92"))
    tms <- times(c("23:03:20", "23:29:56", "01:03:30",
                    "18:21:03", "16:56:26"))     
    x <- chron(dates = dts, times = tms) # original dates
    x
    [1] (02/27/92 23:03:20) (02/27/92 22:29:56) (01/14/92 01:03:30)
    [4] (02/28/92 18:21:03) (02/01/92 16:56:26)
    trunc.minutes(x, 15) # new dates at 15 minute intervals
    [1] (02/27/92 23:00:00) (02/27/92 22:15:00) (01/14/92 01:00:00)
    [4] (02/28/92 18:15:00) (02/01/92 16:45:00)
    trunc.minutes(x, 30) # new dates at 30 minute intervals
    [1] (02/27/92 23:00:00) (02/27/92 22:00:00) (01/14/92 01:00:00)
    [4] (02/28/92 18:00:00) (02/01/92 16:30:00)
    

    最后,您现在可以使用此函数来聚合数据:

    ts.zoo <- zoo(rnorm(5), x) # a zoo time series
    

    或者只是使用这些新日期进行聚合(看看它如何汇总第二个示例,因为该窗口中有两个值):

    > aggregate(ts.zoo, trunc.minutes(x, 15), mean)
    (01/14/92 01:00:00) (02/01/92 16:45:00) (02/27/92 23:00:00) (02/27/92 23:15:00) 
             -0.6738659          -0.4844803           0.7968155          -1.3571121 
    (02/28/92 18:15:00) 
              0.7625861 
    > aggregate(ts.zoo, trunc.minutes(x, 30), mean)
    (01/14/92 01:00:00) (02/01/92 16:30:00) (02/27/92 23:00:00) (02/28/92 18:00:00) 
             -0.6738659          -0.4844803          -0.2801483           0.7625861 
    

    【讨论】:

    • 我同意似乎没有内置的时间方法,只有日期。我只是注意到数学不喜欢军事时间(00 小时结果为 NA)。也许我使用的字符串方法可以与包装函数一起使用,使其重新成为 chron。
    • 我更新了我的示例。您可以像上面一样在动物园对象上使用聚合。
    【解决方案2】:

    chron 有一个 trunc.times 方法,所以我们可以这样做:

    library(zoo)
    library(chron)
    z <- zoo(1:5, 
       chron(c("02/27/92", "02/27/92", "01/14/92", "02/28/92", "02/01/92"),
       c("23:03:20", "23:29:56", "01:03:30", "18:21:03", "16:56:26")))
    aggregate(z, function(x) trunc(x, "00:15:00"), mean)
    

    【讨论】:

      【解决方案3】:

      鉴于 Shane 的想法,我对其进行了一些更改...最初的问题是如何汇总所涉及小时内的分钟数并去掉日期。另外由于数学不喜欢午夜之前,我正在使用字符串解析。

      # 其中 X 是一个包含时间和日期的 chron 时间戳的动物园 obj # 和 min 就像半小时间隔的 "00:30:00" > trunc.chrontime = 函数 (x, min) { if (!inherits(x, "times")) x = as.chron(x) s = substr(as.character(x),11,18) c = chron(次=s) 截断(c,min) } > s = 聚合(d,trunc.minstr(index(d),"00:30:00"),mean) s 00:00:00 0.5522222 0.4988889 0.006666667 00:30:00 0.5822222 0.5366667 0.012222222 01:00:00 0.3388889 0.4455556 0.000000000 01:30:00 0.3422222 0.4344444 0.000000000 02:00:00 0.3366667 0.4366667 0.000000000 ...

      【讨论】:

      • 这也有效。你没有提到在你的问题中去掉日期,虽然很容易改变我的做法(只需从函数返回时间而不是 chron 对象)。
      • 您是对的,尽管在我的示例数据中我试图说明这一点。那是我原来问题的一半。谢谢。
      猜你喜欢
      • 2013-05-15
      • 2011-12-14
      • 2012-02-27
      • 2015-02-16
      • 2012-02-27
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多