Dividindo séries temporais irregulares em médias mensais regulares - R

Para estabelecer efeitos sazonais no uso de energia, preciso alinhar as informações de uso de energia que tenho de um banco de dados de faturamento com temperaturas mensais.

Estou trabalhando com um conjunto de dados de faturamento com contas de duração variável e datas de início e término, e gostaria de obter a média mensal de cada conta em cada mês. Por exemplo, tenho um banco de dados de faturamento com as seguintes características:

   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

Eu gostaria de descobrir como coagir essas séries temporais um tanto irregulares (para cada conta) para obter o valor médio por dia dentro de cada mês que é medido em cada fatura, de forma que:

   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

Eu sou bastante agnóstico para qualquer ferramenta pode fazer isso, desde que eu só tenho que fazer isso uma vez.

Uma ruga adicional é que a tabela tem cerca de 150.000 linhas de comprimento, o que não é realmente muito grande para a maioria dos padrões, mas grande o suficiente para dificultar uma solução de loop em R. Eu investiguei usando os pacotes zoo, xts e tempdisagg em R. Eu comecei a escrever um loop realmente feio que dividiria cada fatura, crie uma linha para cada mês dentro de uma conta existente e, em seguida, toque em () para resumir por conta e meses, mas honestamente, não conseguia ver como fazê-lo com eficiência.

No MySQL, eu tentei isso:

criar ou substituir view v3 como select 1 n union all seleciona 1 union all seleciona 1;
crie ou substitua view v como select 1 n da v3 a, v3 b union all seleciona 1;
conjunto @n = 0;
drop table if exists calendar; criar calendário de tabelas (chave primária de data dt);
inserir no calendário
selecione cast ('2008-1-1' + interval @n: = @n + 1 dia como data) como dt de v, v, v, c, v, v, v;

selecione acct, amount, begin, end, billAmtPerDay, soma (billAmtPerDay), MonthAmt, count () Dias, soma (billAmtPerDay) / count () AverageAmtPerDay, ano (dt), mês (dt) FROM (selecionar *, quantidade / dias billAmtPerDay das contas b inner join calendar c on dt entre begin e end e begin <> dt) x group por acct, amount, begin, end billAmtPerDay, ano (dt), mês (dt);

Mas por motivos que não entendo, meu servidor não gosta dessa tabela e fica preso na junção interna, mesmo quando eu realizo os cálculos diferentes. Estou investigando se há algum limite de memória temporária.

Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion