为了确定对能源使用的季节性影响,我需要将我从计费数据库中获得的能源使用信息与每月温度相匹配。
我正在使用具有不同长度以及开始和结束日期的账单的计费数据集,并且我想获得每个月内每个帐户的月平均值。例如,我有一个具有以下特征的计费数据库:
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 from va, vb, vc, vd, ve, v;select acct, amount, begin, end, billAmtPerDay, sum(billAmtPerDay), MonthAmt, count( ) Days, sum(billAmtPerDay)/count( ) AverageAmtPerDay, year(dt), month(dt) FROM (select *, amount/days billAmtPerDay 来自账单 b 内部连接日历 c 在 begin 和 end 之间的 dt 和 begin <> dt) x 按帐户、金额、开始、结束、billAmtPerDay、年(dt)、月(dt) 分组;
但是由于我不明白的原因,我的服务器不喜欢这个表,并且在内部连接上挂断了,即使我进行不同的计算也是如此。我正在调查它是否有任何临时内存限制。
谢谢!