////////////////////////////////////////////////////////////////////////////////
//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
);