close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Changes between Initial Version and Version 1 of Ticket #1281


Ignore:
Timestamp:
Jul 11, 2011, 11:16:22 AM (14 years ago)
Author:
Víctor de Buen Remiro
Comment:

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_Hor puesto que es exactamete lo mismo que Hourly sólo que más lento.

Legend:

Unmodified
Added
Removed
Modified
  • Ticket #1281

    • Property Status changed from new to closed
    • Property Resolution changed from to fixed
  • Ticket #1281 – Description

    initial v1  
    33quiero 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:
    441.- Me creo el fechado:
    5 {{{ 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)); }}}
     5{{{
     6TimeSet Lan_Hor = Hourly*(
     7 H(0)+H(1)+H(2)+H(3)+H(4)+H(5)+
     8 H(6)+H(7)+H(8)+H(9)+H(10)+H(11)+
     9 H(12)+H(13)+H(14)+H(15)+H(16)+H(17)+
     10 H(18)+H(19)+H(20)+H(21)+H(22)+H(23));
     11}}}
    6122.- Creo la serie indicadora, hago el fechado inverso:
    713{{{
     
    1218....
    1319Serie Hora_23 = InvCh(Hora_23_Diario, Ser_Ind);
    14  }}}
     20}}}
    15213.- Me encuentro con que todas las series están en fechado horario pero con el valor de la Serie en las 00 horas.
    16224.- 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.