#1281 closed doubt (fixed)
Pasar series diarias a horarias
| Reported by: | Lander Ibarra Iriondo | Owned by: | Víctor de Buen Remiro |
|---|---|---|---|
| Priority: | normal | Milestone: | Mantainance |
| Component: | TimeAlgebra | Version: | head |
| Severity: | normal | Keywords: | |
| Cc: |
Description (last modified by )
Buenos días, en el piloto en el que me encuentro trabajando estoy en la siguiente situación:
Tengo 24 series en Diario que hacen referencia a una hora de día y
quiero pasar cada una de ellas a la serie horaria con el dato en la hora correspondiente en el fechado horario. Ya lo estoy haciendo pero me parece que mi solución es un poco "engorrosa", paso a contárosla:
1.- Me creo el fechado:
TimeSet Lan_Hor = Hourly*( H(0)+H(1)+H(2)+H(3)+H(4)+H(5)+ H(6)+H(7)+H(8)+H(9)+H(10)+H(11)+ H(12)+H(13)+H(14)+H(15)+H(16)+H(17)+ H(18)+H(19)+H(20)+H(21)+H(22)+H(23));
2.- Creo la serie indicadora, hago el fechado inverso:
Serie Ser_Ind = CalInd(Lan_Hor, Hourly); Serie Hora_00 = InvCh(Hora_00_Diario, Ser_Ind); Serie Hora_01 = InvCh(Hora_01_Diario, Ser_Ind); .... .... Serie Hora_23 = InvCh(Hora_23_Diario, Ser_Ind);
3.- Me encuentro con que todas las series están en fechado horario pero con el valor de la Serie en las 00 horas.
4.- La solución engorrosa que le he dado es aplicar un B con los retardos que obtengo del nombre de la serie y extender todas las series por la izquierda y por la derecha.
¿Se os ocurre una forma menos "engorrosa" de darle solución?
Change History (2)
comment:1 Changed 14 years ago by
| Description: | modified (diff) |
|---|---|
| Resolution: | → fixed |
| Status: | new → closed |
comment:2 Changed 14 years ago by
Cuando las series diarias están exactamente en las mismas fechas existe una forma mucho más rápida de reconstruir la serie horaria que se basa en el paso a matrices
////////////////////////////////////////////////////////////////////////////////
//Reconstruye una serie horaria a partir de un conjunto de series diarias con
//los valores correspondientes a cada hora del día. El método sól osirve si
//todas las compoenentes diarias están definidas exactamente entre las mismas
//fechas
Serie ReconstruyeSerieHoraria.FechasFijas(Set diarias.porHoras)
////////////////////////////////////////////////////////////////////////////////
{
Matrix D = Tra(SerSetMat(diarias.porHoras));
MatSerSet(GetNumeric([[D]]),Horario,First(diarias.porHoras[1]))[1]
};
//Serie horaria reconstruida
Serie horaria.FechasFijas = ReconstruyeSerieHoraria.FechasFijas(diarias.porHoras);
//Comprobamos que la serie reconstruida es igual que la original
Real ok.FechasFijas = And
(
First(horaria.original)==First(horaria.FechasFijas),
Last(horaria.original)==Last(horaria.FechasFijas),
MaxS(Abs(horaria.original-horaria.FechasFijas))==0
);

Yo tengo una función para separar series horarias en diarias y otra para reconstruirla horaria a partir de las componentes diarias que están suficientemente testadas. La idea es en abstracto la misma que la que propones solo que programada estructuradamente con ciclos de control en vez de manualmente:
//////////////////////////////////////////////////////////////////////////////// //Separa una serie horaria en 24 series diarias con los valores correspondientes //a cada hora del día Set SeparaSerieHorariaEnDiarias(Serie horaria) //////////////////////////////////////////////////////////////////////////////// { //Prefijo meramente ornamental para poner nombres a las componentes Text prefix = If(Name(horaria)!="", Name(horaria), "SeparaHorariaEnDiarias"); //Fechas de cálculo Date f = First(horaria); Date l = Last(horaria); //División en componentes diarias por horas For(0,23,Serie(Real h) { //Se adelanta la serie horaria el número correspondienete de horas para que //al pasar a Diario con FirstS queden sólo los datos de esa hora Serie aux = SubSer(DatCh((F^h):horaria, Diario, FirstS),f,l); //Renombramos las series para visualizarlas mejor Eval(prefix+".H"<<FormatReal(h,"%02.0lf")+"=aux") }) }; //////////////////////////////////////////////////////////////////////////////// //Reconstruye una serie horaria a partir de un conjunto de series //diarias con los valores correspondientes a cada hora del día Serie ReconstruyeSerieHoraria(Set diarias.porHoras) //////////////////////////////////////////////////////////////////////////////// { //Pasamos a horario cada componente diaria y la adelantamos las horas que //le corresponden Set ser.hor = For(0,23,Serie(Real h) { (B^h):InvCh(diarias.porHoras[h+1],CalInd(W,Horario)) }); //Fechas de cálculo Date f = SetMinDate(EvalSet(ser.hor,First)); Date l = SetMaxDate(EvalSet(ser.hor,Last)); //Variable auxiliar para completar por delante y por detrás cada componente Serie zero = SubSer(CalInd(W,Horario),f,l); //Sumamos las componentes completadas SetSum(For(0,23,Serie(Real h) { zero << ser.hor[h+1] >> zero })) }; //Serie horaria original aleatoria Serie horaria.original = SubSer(Rand(-1,1,Horario),y2011,y2011m01d04h23); //Series diarias con los valores correspondientes a cada hora del día Set diarias.porHoras = SeparaSerieHorariaEnDiarias(horaria.original); //Serie horaria reconstruida Serie horaria = ReconstruyeSerieHoraria(diarias.porHoras); //Comprobamos que la serie reconstruida es igual que la original Real ok = And ( First(horaria.original)==First(horaria), Last(horaria.original)==Last(horaria), MaxS(Abs(horaria.original-horaria))==0 );A lo que no le veo sentido alguno es al fechado
Lan_Horpuesto que es exactamete lo mismo queHourlysólo que más lento.