每个日期的日历月度使用情况

时间:2015-10-13 18:45:59

标签: r function datetime sum aggregate

在这里,我有一个包含开始日期和结束日期以及用法的数据集。我计算了这两天之间的天数并得到了每日使用量。 (我现在每天都可以使用一个扁平的用法)。

现在,我想要实现的是6月份那些TIME-FRAME中每一天的使用总和。例如,第一种情况只是Daily_usage

file://

而且,对于第二,我想将使用3905添加到6月1日,也是6月2日,因为它在6月1日和6月2日都有。

START_DATE     END_DATE          x     DAYS    DAILY_USAGE
1 2015-05-01  2015-06-01    261605.00   32     8175.156250

我想继续为所有387行执行此操作,最后获取每天的用法总和。并且,我不知道如何为数百条记录执行此操作。 这就是我的数据集现在的样子:

2015-05-04 2015-06-02   117159.00   30   3905.3000000

此外,标题。

 str(YYY)
'data.frame':   387 obs. of  5 variables:
 $ START_DATE : Date, format: "2015-05-01" "2015-05-04" "2015-05-11" "2015-    05-13" ...
 $ END_DATE   : Date, format: "2015-06-01" "2015-06-01" "2015-06-01" "2015-06-01" ...
 $ x          : num  261605 1380796 183 103 489 ...
 $ DAYS       : num  32 29 22 20 19 12 1 34 30 29 ...
 $ DAILY_USAGE: num  8175.16 47613.66 8.32 5.13 25.74 ...

依旧........

数据集和结果示例

我将调用此数据集。例1(3天,模拟数据)

START_DATE   END_DATE           x DAYS    DAILY_USAGE
1   2015-05-01 2015-06-01   261605.00   32   8175.1562500
2   2015-05-04 2015-06-01  1380796.00   29  47613.6551724
6   2015-05-21 2015-06-01     1392.00   12    116.0000000
7   2015-06-01 2015-06-01     2503.00    1   2503.0000000
8   2015-04-30 2015-06-02        0.00   34      0.0000000
9   2015-05-04 2015-06-02   117159.00   30   3905.3000000
10  2015-05-05 2015-06-02   193334.00   29   6666.6896552
13  2015-05-04 2015-06-03      630.00   31     20.3225806

对于上面的例子,答案应该是这样的

START_DATE  END_DATE    x   DAYS    DAILY_USAGE
5/1/2015    6/1/2015    261605  32  8175.15625
5/4/2015    6/1/2015    1380796 29  47613.65517
5/11/2015   6/1/2015    183     22  8.318181818
4/30/2015   6/2/2015    0       34  0
5/20/2015   6/2/2015    70      14  5
6/1/2015    6/2/2015    569     2   284.5
6/1/2015    6/3/2015    582     3   194
6/2/2015    6/3/2015    6       2   3

怎么样? 在示例1中,对于6月1日,我添加了除最后一行使用之外的所有用法行,因为最后一行不包括时间范围内的日期06/01。它从06/02开始,到06/03结束。

要获得6月2日,我已将第4行的所有用法添加到第8行,因为6月2日介于所有开始日期和结束日期之间。

6月3日,我只添加,最后两行得到197。

那么,何处总和,取决于Start&的时间范围。 END_DATE。

希望这有帮助!

这可能有一个简单的技巧,而不是编写400行If else语句。

再次感谢您的时间!!

-Gyve

1 个答案:

答案 0 :(得分:1)

library(lubridate)
indx <- lapply(unique(mdy(df[,2])), '%within%', interval(mdy(df[,1]), mdy(df[,2])))
cbind.data.frame(DAY=unique(df$END_DATE), 
                 USAGE=unlist(lapply(indx, function(x) sum(df$DAILY_USAGE[x]))))
#        DAY    USAGE
# 1 6/1/2015 56280.63
# 2 6/2/2015   486.50
# 3 6/3/2015   197.00

<强>解释

我们可以扩展它来解释发生了什么:

indx <- lapply(unique(mdy(df[,2])), '%within%', interval(mdy(df[,1]), mdy(df[,2])))

测试唯一结束日期在第一列和第二列的范围天数内。 mdy是使用lubridate转换为POSIXct的快捷方式。运算符%within%根据间隔测试日期。我们使用interval('col1', 'col2')创建了时间间隔。这将创建一个索引,我们可以通过它来对数据进行子集化。

在我们的最终数据框中,

cbind.data.frame(DAY=unique(df$END_DATE),

创建第一列日期。

 USAGE=unlist(lapply(indx, function(x) sum(df$DAILY_USAGE[x])))

df$DAILY_USAGE的总和除以我们创建的索引。