POSIXct日期匹配(可能很简单!)

时间:2013-06-27 11:51:34

标签: r match posixct

我需要从数据框创建一个Xts对象,按周拆分然后执行计算。我不知道如何将Xts POSIXct日期与父数据框的POSIXct日期相匹配,以便获得每周计算。

示例:

value <- rep(1, 10)
staff <- as.factor(c("Sam", "Sue", "Sam", "Mary", "Bob", "Sue", "Sam", "Sam", "Sue", "Mary"))
DTime <- as.POSIXct(c("2013-04-01 08:27:00", "2013-04-05 08:28:00", "2013-04-08 08:31:00", 
                    "2013-04-11 08:32:00", "2013-04-15 08:33:00", "2013-04-15 08:40:00",
                    "2013-04-24 08:41:00", "2013-04-27 08:46:00", "2013-04-30 08:46:00",
                    "2013-04-30 08:46:00"))
DF <- data.frame(DTime, staff, value)
tapply(DF$value, DF$staff, sum)

这给出了每月计算但随后分裂:

XtsDF <- xts(order.by=DF$DTime, dateFormat="POSIXct")
weeks <- split(XtsDF,f="weeks")

我如何获取每周的日期/时间并与DF匹配,以便由员工执行总和?

2 个答案:

答案 0 :(得分:3)

我认为使用lubridate可以更轻松地简化POSIXt日期的大量操作,如果将它耦合到plyr则更容易。

所以这是我解决这个问题的方法

require(lubridate)
require(plyr)

ddply(DF, .(month = month(DTime), staff), summarise, Sum = sum(value))
##   month staff Sum
## 1     4   Bob   1
## 2     4  Mary   2
## 3     4   Sam   4
## 4     4   Sue   3


ddply(DF, .(week = week(DTime), staff), summarise, Sum = sum(value))
##   week staff Sum
## 1   14   Sam   1
## 2   14   Sue   1
## 3   15  Mary   1
## 4   15   Sam   1
## 5   16   Bob   1
## 6   16   Sue   1
## 7   17   Sam   2
## 8   18  Mary   1
## 9   18   Sue   1

答案 1 :(得分:1)

这是一个data.table解决方案,我会先创建一个新的变量数周

library(data.table)
DT <- as.data.table(DF)
origin <- as.POSIXct("2012-12-9")  ## A Sunday
DT[, c('weekID','sum') := c(weekID,sum(value)),
      by=list(staff,weekID = as.numeric(DTime - origin) %/% 7)]


                DTime staff value weekID sum
 1: 2013-04-01 08:27:00   Sam     1     16  16
 2: 2013-04-05 08:28:00   Sue     1     16  16
 3: 2013-04-08 08:31:00   Sam     1     17  17
 4: 2013-04-11 08:32:00  Mary     1     17  17
 5: 2013-04-15 08:33:00   Bob     1     18  18
 6: 2013-04-15 08:40:00   Sue     1     18  18
 7: 2013-04-24 08:41:00   Sam     1     19  19
 8: 2013-04-27 08:46:00   Sam     1      2   2
 9: 2013-04-30 08:46:00   Sue     1     20  20
10: 2013-04-30 08:46:00  Mary     1     20  20