功能:计算数据点之间的秒数

时间:2012-03-06 09:52:15

标签: r function time

我的数据框中有以下列:

              DateTime
1  2011-10-03 08:00:04
2  2011-10-03 08:00:05
3  2011-10-03 08:00:06
4  2011-10-03 08:00:09
5  2011-10-03 08:00:15
6  2011-10-03 08:00:24
7  2011-10-03 08:00:30
8  2011-10-03 08:00:42
9  2011-10-03 08:01:01
10 2011-10-03 08:01:24
11 2011-10-03 08:01:58
12 2011-10-03 08:02:34
13 2011-10-03 08:03:25
14 2011-10-03 08:04:26
15 2011-10-03 08:06:00

使用dput

> dput(smallDF)
structure(list(DateTime = structure(c(1317621604, 1317621605, 
1317621606, 1317621609, 1317621615, 1317621624, 1317621630, 1317621642, 
1317621661, 1317621684, 1317621718, 1317621754, 1317621805, 1317621866, 
1317621960, 1317622103, 1317622197, 1317622356, 1317622387, 1317622463, 
1317622681, 1317622851, 1317623061, 1317623285, 1317623404, 1317623498, 
1317623612, 1317623849, 1317623916, 1317623994, 1317624174, 1317624414, 
1317624484, 1317624607, 1317624848, 1317625023, 1317625103, 1317625179, 
1317625200, 1317625209, 1317625229, 1317625238, 1317625249, 1317625264, 
1317625282, 1317625300, 1317625315, 1317625339, 1317625353, 1317625365, 
1317625371, 1317625381, 1317625395, 1317625415, 1317625423, 1317625438, 
1317625458, 1317625469, 1317625487, 1317625500, 1317625513, 1317625533, 
1317625548, 1317625565, 1317625581, 1317625598, 1317625613, 1317625640, 
1317625661, 1317625674, 1317625702, 1317625715, 1317625737, 1317625758, 
1317625784, 1317625811, 1317625826, 1317625841, 1317625862, 1317625895, 
1317625909, 1317625935, 1317625956, 1317625973, 1317626001, 1317626043, 
1317626062, 1317626100, 1317626113, 1317626132, 1317626153, 1317626179, 
1317626212, 1317626239, 1317626271, 1317626296, 1317626323, 1317626361, 
1317626384, 1317626407), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = "DateTime", row.names = c(NA, 
-100L), class = "data.frame")

我的目标:我想计算每次测量之间的时差,以秒为单位。

修改的 我希望得到以下结果,其中计算每个数据点之间的时间差(以秒为单位),以外的第一个值(第3行),当计算时间时相对于上午8点:

              DateTime      Seconds
1  2011-09-30 21:59:02      6
2  2011-09-30 21:59:04      2
3  2011-10-03 08:00:04      4
4  2011-10-03 08:00:05      1
5  2011-10-03 08:00:06      1
6  2011-10-03 08:00:09      3
7  2011-10-03 08:00:15      5
8  2011-10-03 08:00:24      9
9  2011-10-03 08:00:30      6
10 2011-10-03 08:00:42      12
11 2011-10-03 08:01:01      19
12 2011-10-03 08:01:24      23
13 2011-10-03 08:01:58      34
14 2011-10-03 08:02:34      36
15 2011-10-03 08:03:25      51
16 2011-10-03 08:04:26      61
17 2011-10-03 08:06:00      94

但是,测量从上午8:00开始,因此如果该值是当天的第一天,则需要计算相对于上午8:00的秒数。在上面的示例中,第一次测量在8:00:04结束,因此使用$sec POSIX属性可以在这里工作,但在其他日子,第一个值可能在8:00后几分钟发生点。

我试图通过以下功能实现这一目标:

SecondsInBar <- function(x, startTime){
    # First data point or first of day
    if (x == 1 || x > 1 && x$wkday != x[-1]$wkday){
        seconds <- as.numeric(difftime(x, 
            as.POSIXlt(startTime, format = "%H:%M:%S"), 
            units = "secs"))
    # else calculate time difference
    } else {
        seconds <- as.numeric(difftime(x, x[-1], units = "secs"))
    }
    return (seconds)
}

然后可以使用SecondsInBar(smallDF$DateTime, "08:00:00")调用。

此功能至少存在两个问题,但我不知道如何解决这些问题:

  • 代码段x$wkday != x[-1]$wkday返回$ operator is invalid for atomic vectors错误,
  • as.POSIXlt(startTime, format = "%H:%M:%S")使用了。{ 当前日期,使difftime计算错误。

我的问题: 这个功能在哪里出错了? 而且:这种方法是可行的方法,还是应该从不同的角度来看待它?

1 个答案:

答案 0 :(得分:1)

这些方面的内容如何:

smallDF$DateTime - as.POSIXct(paste(strftime(smallDF$DateTime,"%Y-%m-%d"),"07:00:00"))
Time differences in secs
  [1]    4    5    6    9   15   24   30   42   61   84  118  154  205  266  360
 [16]  503  597  756  787  863 1081 1251 1461 1685 1804 1898 2012 2249 2316 2394
 [31] 2574 2814 2884 3007 3248 3423 3503 3579 3600 3609 3629 3638 3649 3664 3682
 [46] 3700 3715 3739 3753 3765 3771 3781 3795 3815 3823 3838 3858 3869 3887 3900
 [61] 3913 3933 3948 3965 3981 3998 4013 4040 4061 4074 4102 4115 4137 4158 4184
 [76] 4211 4226 4241 4262 4295 4309 4335 4356 4373 4401 4443 4462 4500 4513 4532
 [91] 4553 4579 4612 4639 4671 4696 4723 4761 4784 4807
attr(,"tzone")
[1] ""

请注意,我使用了7am,因为我复制了数据,我决定将其解释为BST。

对于您的错误,您无法使用$获取POSIXct的日期元素(定义{{​​1}}的方式),仅使用smallDF$DateTime 。对于第二个错误,如果您不提供日期,则必须假设当前日期,因为没有其他信息可供使用。

修改

现在已经澄清了,我会提出一个不同的方法:POSIXlt白天的数据框,然后split将时间与参考时间联合起来并对其进行c,使用diff循环几天:

lapply