【发布时间】:2012-09-15 11:36:34
【问题描述】:
为了确定对能源使用的季节性影响,我需要将我从计费数据库中获得的能源使用信息与每月温度相匹配。
我正在使用一个帐单数据集,其中包含不同长度以及开始和结束日期的帐单,我想获取每个帐户在每个月内的月平均值。例如,我有一个具有以下特征的计费数据库:
acct amount begin end days
1 2242 11349 2009-10-06 2009-11-04 29
2 2242 12252 2009-11-04 2009-12-04 30
3 2242 21774 2009-12-04 2010-01-08 35
4 2242 18293 2010-01-08 2010-02-05 28
5 2243 27217 2009-10-06 2009-11-04 29
6 2243 117 2009-11-04 2009-12-04 30
7 2243 14543 2009-12-04 2010-01-08 35
我想弄清楚如何强制这些有些不规则的时间序列(对于每个帐户)以获得每个账单中跨越的每个月内每天的平均金额,例如:
acct amount begin end days avgamtpday
1 2242 11349 2009-10-01 2009-10-31 31 X
2 2242 12252 2009-11-01 2009-11-30 30 X
3 2242 21774 2009-12-01 2010-12-31 31 X
4 2242 18293 2010-01-01 2010-01-31 31 X
4 2242 18293 2010-02-01 2010-02-28 28 X
5 2243 27217 2009-10-01 2009-10-31 31 X
6 2243 117 2009-11-01 2009-11-30 30 X
7 2243 14543 2009-12-01 2009-12-31 30 X
7 2243 14543 2010-01-01 2010-01-31 31 X
我不知道哪种工具可以做到这一点,因为我只需要这样做一次。
另一个问题是该表大约有 150,000 行长,按照大多数标准,这并不是很大,但足以使 R 中的循环解决方案变得困难。我在 R 中使用 zoo、xts 和 tempdisagg 包进行了调查。我开始编写一个非常丑陋的循环,它会拆分每个账单,然后在现有账单中为每个月创建一行,然后 tapply() 通过 accts 进行汇总和几个月,但老实说,看不出如何有效地做到这一点。
在 MySQL 中,我试过这个:
创建或替换视图 v3 为 select 1 n union all select 1 union all select 1;
创建或替换视图 v 为 select 1 n from v3 a, v3 b union all select 1;
设置@n = 0;
如果存在日历,则删除表; 创建表日历(dt日期主键);
插入日历
select cast('2008-1-1' + interval @n:=@n+1 day as date) as dt 从 v a, v b, v c, v d, v e, v;选择帐户、金额、开始、结束、billAmtPerDay、sum(billAmtPerDay)、MonthAmt、 count() 天,sum(billAmtPerDay)/count() 平均AmtPerDay,年(dt),月(dt) FROM ( 选择 *, 金额/天 billAmtPerDay 从账单 b 在 begin 和 end 之间的 dt 上的内部连接日历 c 和 begin dt) x 按账户、金额、开始、结束、账单日、年(dt)、月(dt)分组;
但由于我不明白的原因,我的服务器不喜欢这个表,并且在内部连接上挂起,即使我进行不同的计算也是如此。我正在调查它是否有任何临时内存限制。
谢谢!
【问题讨论】:
-
您的计费周期是否与实际月份一致,或者是某种功能“每个月的第 X 天是新周期开始的时间”类型的情况?
-
计费周期不规则,因此大多数账单平均为 30 +/- 2 天,但有些账单长达 90 天或更长时间。
-
那么您需要一些方法来计算仅给定日期的计费周期,以便您可以进行适当的分组。
-
@D.Hsu 答案好吗?如果是,请不要忘记接受其中一个答案。
标签: sql r data.table xts zoo