/// <summary> /// Returns a timestampseries at the required timestep /// Returns a new empty timestampseries if no data exists. /// </summary> /// <param name="TimeStep"></param> /// <returns></returns> public FixedTimeStepSeries GetTs(TimeStepUnit TimeStep) { FixedTimeStepSeries toreturn; if (!data.TryGetValue(TimeStep, out toreturn)) { if (data.Count == 0) { toreturn = new FixedTimeStepSeries() { TimeStepSize = TimeStep, Name = Name + "_" + TimeStep.ToString() }; } if (data.ContainsKey(TimeStepUnit.Day)) { toreturn = TSTools.ChangeZoomLevel(data[TimeStepUnit.Day], TimeStep, Accumulate); } else if (data.ContainsKey(TimeStepUnit.Month)) { toreturn = TSTools.ChangeZoomLevel(data[TimeStepUnit.Month], TimeStep, Accumulate); } data.Add(TimeStep, toreturn); } return(toreturn); }
public static DateTime GetNextTime(DateTime Start, TimeStepUnit timespan) { switch (timespan) { case TimeStepUnit.Year: return(Start.AddYears(1)); case TimeStepUnit.Month: return(Start.AddMonths(1)); case TimeStepUnit.Day: return(Start.AddDays(1)); case TimeStepUnit.Hour: return(Start.AddHours(1)); case TimeStepUnit.Minute: return(Start.AddMinutes(1)); case TimeStepUnit.Second: return(Start.AddSeconds(1)); default: throw new Exception("TimeStepUnit not set"); } }
/// <summary> /// Returns a timestampseries at the required timestep /// Returns a new empty timestampseries if no data exists. /// </summary> /// <param name="TimeStep"></param> /// <returns></returns> public FixedTimeStepSeries GetTs(TimeStepUnit TimeStep) { FixedTimeStepSeries toreturn; if (!data.TryGetValue(TimeStep, out toreturn)) { if (data.Count == 0) { toreturn = new FixedTimeStepSeries() { TimeStepSize = TimeStep, Name = Name + "_" + TimeStep.ToString() }; } if (data.ContainsKey(TimeStepUnit.Day)) toreturn = TSTools.ChangeZoomLevel(data[TimeStepUnit.Day], TimeStep, Accumulate); else if (data.ContainsKey(TimeStepUnit.Month)) toreturn = TSTools.ChangeZoomLevel(data[TimeStepUnit.Month], TimeStep, Accumulate); data.Add(TimeStep, toreturn); } return toreturn; }
public static DateTime SubstractTimeStepUnit(this DateTime dt, TimeStepUnit tstep) { switch (tstep) { case TimeStepUnit.Year: return dt.AddYears(-1); case TimeStepUnit.Month: return dt.AddMonths(-1); case TimeStepUnit.Day: return dt.AddDays(-1); case TimeStepUnit.Hour: return dt.AddHours(-1); case TimeStepUnit.Minute: return dt.AddMinutes(-1); case TimeStepUnit.Second: return dt.AddSeconds(-1); } return dt; }
public static DateTime GetTimeOfFirstTimeStep(DateTime Start, TimeStepUnit tsu) { switch (tsu) { case TimeStepUnit.Year: return(new DateTime(Start.Year, 1, 1)); case TimeStepUnit.Month: return(new DateTime(Start.Year, Start.Month, 1)); case TimeStepUnit.Day: return(new DateTime(Start.Year, Start.Month, Start.Day)); case TimeStepUnit.Hour: return(new DateTime(Start.Year, Start.Month, Start.Day, Start.Hour, 0, 0)); case TimeStepUnit.Minute: return(new DateTime(Start.Year, Start.Month, Start.Day, Start.Hour, Start.Minute, 0)); case TimeStepUnit.Second: return(new DateTime(Start.Year, Start.Month, Start.Day, Start.Hour, Start.Minute, Start.Second)); } return(Start); }
public static DateTime SubstractTimeStepUnit(this DateTime dt, TimeStepUnit tstep) { switch (tstep) { case TimeStepUnit.Year: return(dt.AddYears(-1)); case TimeStepUnit.Month: return(dt.AddMonths(-1)); case TimeStepUnit.Day: return(dt.AddDays(-1)); case TimeStepUnit.Hour: return(dt.AddHours(-1)); case TimeStepUnit.Minute: return(dt.AddMinutes(-1)); case TimeStepUnit.Second: return(dt.AddSeconds(-1)); } return(dt); }
public static TimeStampSeries ChangeZoomLevel(TimeStampSeries Data, TimeStepUnit NewZoomLevel, bool Accumulate) { TimeStampSeries ToReturn = new TimeStampSeries(); ToReturn.DeleteValue = Data.DeleteValue; ToReturn.Name = Data.Name; ToReturn.ID = Data.ID; ToReturn.TimeStepSize = NewZoomLevel; DateTime start = Data.StartTime; DateTime end = Data.EndTime; int localcount = 0; switch (NewZoomLevel) { case TimeStepUnit.Year: { int currentyear = start.Year; ToReturn.Items.Add(new TimeStampValue(new DateTime(start.Year, 1, 1), 0)); foreach (var v in Data.Items.Where(dv => dv.Value != Data.DeleteValue)) { if (v.Time.Year == currentyear) { ToReturn.Items.Last().Value += v.Value; } else { currentyear = v.Time.Year; if (!Accumulate) { ToReturn.Items.Last().Value /= localcount; } localcount = 0; ToReturn.Items.Add(new TimeStampValue(new DateTime(v.Time.Year, 1, 1), v.Value)); } localcount++; } if (!Accumulate) { ToReturn.Items.Last().Value /= localcount; } } break; case TimeStepUnit.Month: int currentmonth = start.Month; ToReturn.Items.Add(new TimeStampValue(new DateTime(start.Year, start.Month, 1), 0)); foreach (var v in Data.Items.Where(dv => dv.Value != Data.DeleteValue)) { if (v.Time.Month == currentmonth) { ToReturn.Items.Last().Value += v.Value; } else { currentmonth = v.Time.Month; if (!Accumulate) { ToReturn.Items.Last().Value /= localcount; } localcount = 0; ToReturn.Items.Add(new TimeStampValue(new DateTime(v.Time.Year, v.Time.Month, 1), v.Value)); } localcount++; } if (!Accumulate) { ToReturn.Items.Last().Value /= localcount; } break; case TimeStepUnit.Day: break; case TimeStepUnit.Hour: break; case TimeStepUnit.Minute: break; case TimeStepUnit.Second: break; case TimeStepUnit.None: break; default: break; } return(ToReturn); }
/// <summary> /// Gets a fixedtimestepseries at another zoom level. /// </summary> /// <param name="Data"></param> /// <param name="NewZoomLevel"></param> /// <param name="Accumulate"></param> /// <returns></returns> public static FixedTimeStepSeries ChangeZoomLevel(FixedTimeStepSeries Data, TimeStepUnit NewZoomLevel, bool Accumulate) { if (Data.TimeStepSize <= NewZoomLevel) { return(null); } FixedTimeStepSeries ToReturn = new FixedTimeStepSeries(); ToReturn.DeleteValue = Data.DeleteValue; ToReturn.TimeStepSize = NewZoomLevel; ToReturn.StartTime = GetTimeOfFirstTimeStep(Data.StartTime, NewZoomLevel); ToReturn.OffSetStartTime = Data.OffSetStartTime; ToReturn.OffSetEndTime = Data.OffSetEndTime; List <double> newvalues = new List <double>(); int localcount = 0; int counter = 0; switch (NewZoomLevel) { case TimeStepUnit.Year: { int currentyear = -1; foreach (var v in Data.Items) { if (Data.GetTime(counter).Year == currentyear) { if (v.Value != Data.DeleteValue) { newvalues[newvalues.Count - 1] += v.Value; } } else { currentyear = Data.GetTime(counter).Year; if (!Accumulate & newvalues.Count > 0) { newvalues[newvalues.Count - 1] /= localcount; } localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (localcount != 12) //only use complete years { newvalues.RemoveAt(newvalues.Count - 1); } else { if (!Accumulate) { newvalues[newvalues.Count - 1] /= localcount; } } } break; case TimeStepUnit.Month: int currentmonth = Data.StartTime.Month; newvalues.Add(0); foreach (var v in Data.Items) { if (Data.GetTime(counter).Month == currentmonth) { if (v.Value != Data.DeleteValue) { newvalues[newvalues.Count - 1] += v.Value; } } else { currentmonth = Data.GetTime(counter).Month; if (!Accumulate) { newvalues[newvalues.Count - 1] /= localcount; } localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (!Accumulate) { newvalues[newvalues.Count - 1] /= localcount; } break; case TimeStepUnit.Day: int currentday = Data.StartTime.Day; newvalues.Add(0); foreach (var v in Data.Items) { if (Data.GetTime(counter).Day == currentday) { if (v.Value != Data.DeleteValue) { newvalues[newvalues.Count - 1] += v.Value; } } else { currentday = Data.GetTime(counter).Day; if (!Accumulate) { newvalues[newvalues.Count - 1] /= localcount; } localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (!Accumulate) { newvalues[newvalues.Count - 1] /= localcount; } break; case TimeStepUnit.Hour: int currenthour = Data.StartTime.Hour; newvalues.Add(0); foreach (var v in Data.Items) { if (Data.GetTime(counter).Hour == currenthour) { if (v.Value != Data.DeleteValue) { newvalues[newvalues.Count - 1] += v.Value; } } else { currenthour = Data.GetTime(counter).Hour; if (!Accumulate) { newvalues[newvalues.Count - 1] /= localcount; } localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (!Accumulate) { newvalues[newvalues.Count - 1] /= localcount; } break; case TimeStepUnit.Minute: int currentminute = Data.StartTime.Minute; newvalues.Add(0); foreach (var v in Data.Items.Where(vv => vv.Value != Data.DeleteValue)) { if (Data.GetTime(counter).Minute == currentminute) { newvalues[newvalues.Count - 1] += v.Value; } else { currentminute = Data.GetTime(counter).Minute; if (!Accumulate) { newvalues[newvalues.Count - 1] /= localcount; } localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (!Accumulate) { newvalues[newvalues.Count - 1] /= localcount; } break; case TimeStepUnit.Second: break; case TimeStepUnit.None: break; default: break; } ToReturn.AddRange(newvalues.Select(n => new ValueDouble(n))); return(ToReturn); }
/// <summary> /// Changes the zoomlevel of a timespanseries /// </summary> /// <param name="Data"></param> /// <param name="NewZoomLevel"></param> /// <param name="Accumulate"></param> /// <returns></returns> public static IEnumerable <TimeSpanValue> ChangeZoomLevel(TimeSpanSeries Data, TimeStepUnit NewZoomLevel, bool Accumulate) { if (Data.TimeStepSize <= NewZoomLevel) { return(null); } List <TimeSpanValue> ToReturn = new List <TimeSpanValue>(); DateTime start = Data.StartTime; DateTime end = Data.EndTime; TimeSpanValue CurrentValue = new TimeSpanValue(GetTimeOfFirstTimeStep(start, NewZoomLevel), GetTimeOfFirstTimeStep(start, NewZoomLevel).AddTimeStepUnit(NewZoomLevel), 0); double currentcount = 0; foreach (var v in Data.Items.Where(dv => dv.Value != Data.DeleteValue)) { if (CurrentValue.StartTime <= v.StartTime & v.StartTime <= CurrentValue.EndTime) { if (CurrentValue.EndTime >= v.EndTime) //We are still within the timespan { CurrentValue.Value += v.Value; currentcount++; } else //We exceed the timespan { double outsidefraction = (v.EndTime.Subtract(CurrentValue.EndTime).TotalDays / v.EndTime.Subtract(v.StartTime).TotalDays); CurrentValue.Value += v.Value * (1 - outsidefraction); currentcount += 1 - outsidefraction; if (!Accumulate & currentcount != 0) { CurrentValue.Value /= currentcount; } ToReturn.Add(CurrentValue); CurrentValue = new TimeSpanValue(CurrentValue.EndTime, CurrentValue.EndTime.AddTimeStepUnit(NewZoomLevel), v.Value * outsidefraction); currentcount = outsidefraction; } } else { if (!Accumulate & currentcount != 0) { CurrentValue.Value /= currentcount; } ToReturn.Add(CurrentValue); CurrentValue = new TimeSpanValue(GetTimeOfFirstTimeStep(v.StartTime, NewZoomLevel), GetTimeOfFirstTimeStep(v.StartTime, NewZoomLevel).AddTimeStepUnit(NewZoomLevel), v.Value); currentcount = 1; } } if (!Accumulate & currentcount != 0) { CurrentValue.Value /= currentcount; } ToReturn.Add(CurrentValue); return(ToReturn); }
public static TimeStampSeries ChangeZoomLevel(TimeStampSeries Data, TimeStepUnit NewZoomLevel, bool Accumulate) { TimeStampSeries ToReturn = new TimeStampSeries(); ToReturn.DeleteValue = Data.DeleteValue; ToReturn.Name = Data.Name; ToReturn.ID = Data.ID; ToReturn.TimeStepSize = NewZoomLevel; DateTime start = Data.StartTime; DateTime end = Data.EndTime; int localcount = 0; switch (NewZoomLevel) { case TimeStepUnit.Year: { int currentyear = start.Year; ToReturn.Items.Add(new TimeStampValue(new DateTime(start.Year, 1, 1), 0)); foreach (var v in Data.Items.Where(dv => dv.Value != Data.DeleteValue)) { if (v.Time.Year == currentyear) ToReturn.Items.Last().Value += v.Value; else { currentyear = v.Time.Year; if (!Accumulate) ToReturn.Items.Last().Value /= localcount; localcount = 0; ToReturn.Items.Add(new TimeStampValue(new DateTime(v.Time.Year, 1, 1), v.Value)); } localcount++; } if (!Accumulate) ToReturn.Items.Last().Value /= localcount; } break; case TimeStepUnit.Month: int currentmonth = start.Month; ToReturn.Items.Add(new TimeStampValue(new DateTime(start.Year, start.Month, 1), 0)); foreach (var v in Data.Items.Where(dv => dv.Value != Data.DeleteValue)) { if (v.Time.Month == currentmonth) ToReturn.Items.Last().Value += v.Value; else { currentmonth = v.Time.Month; if (!Accumulate) ToReturn.Items.Last().Value /= localcount; localcount = 0; ToReturn.Items.Add(new TimeStampValue(new DateTime(v.Time.Year, v.Time.Month, 1), v.Value)); } localcount++; } if (!Accumulate) ToReturn.Items.Last().Value /= localcount; break; case TimeStepUnit.Day: break; case TimeStepUnit.Hour: break; case TimeStepUnit.Minute: break; case TimeStepUnit.Second: break; case TimeStepUnit.None: break; default: break; } return ToReturn; }
public static DateTime GetTimeOfFirstTimeStep(DateTime Start, TimeStepUnit tsu) { switch (tsu) { case TimeStepUnit.Year: return new DateTime(Start.Year, 1, 1); case TimeStepUnit.Month: return new DateTime(Start.Year, Start.Month, 1); case TimeStepUnit.Day: return new DateTime(Start.Year, Start.Month, Start.Day); case TimeStepUnit.Hour: return new DateTime(Start.Year, Start.Month, Start.Day, Start.Hour, 0, 0); case TimeStepUnit.Minute: return new DateTime(Start.Year, Start.Month, Start.Day, Start.Hour, Start.Minute, 0); case TimeStepUnit.Second: return new DateTime(Start.Year, Start.Month, Start.Day, Start.Hour, Start.Minute, Start.Second); } return Start; }
/// <summary> /// Gets a fixedtimestepseries at another zoom level. /// </summary> /// <param name="Data"></param> /// <param name="NewZoomLevel"></param> /// <param name="Accumulate"></param> /// <returns></returns> public static FixedTimeStepSeries ChangeZoomLevel(FixedTimeStepSeries Data, TimeStepUnit NewZoomLevel, bool Accumulate) { if (Data.TimeStepSize <= NewZoomLevel) return null; FixedTimeStepSeries ToReturn = new FixedTimeStepSeries(); ToReturn.DeleteValue = Data.DeleteValue; ToReturn.TimeStepSize = NewZoomLevel; ToReturn.StartTime= GetTimeOfFirstTimeStep(Data.StartTime, NewZoomLevel); ToReturn.OffSetStartTime = Data.OffSetStartTime; ToReturn.OffSetEndTime = Data.OffSetEndTime; List<double> newvalues = new List<double>(); int localcount = 0; int counter = 0; switch (NewZoomLevel) { case TimeStepUnit.Year: { int currentyear = -1; foreach (var v in Data.Items) { if (Data.GetTime(counter).Year == currentyear) { if (v.Value != Data.DeleteValue) newvalues[newvalues.Count - 1] += v.Value; } else { currentyear = Data.GetTime(counter).Year; if (!Accumulate & newvalues.Count>0) newvalues[newvalues.Count - 1] /= localcount; localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (localcount != 12) //only use complete years newvalues.RemoveAt(newvalues.Count - 1); else { if (!Accumulate) newvalues[newvalues.Count - 1] /= localcount; } } break; case TimeStepUnit.Month: int currentmonth = Data.StartTime.Month; newvalues.Add(0); foreach (var v in Data.Items) { if (Data.GetTime(counter).Month == currentmonth) { if (v.Value != Data.DeleteValue) newvalues[newvalues.Count - 1] += v.Value; } else { currentmonth = Data.GetTime(counter).Month; if (!Accumulate) newvalues[newvalues.Count - 1] /= localcount; localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (!Accumulate) newvalues[newvalues.Count - 1] /= localcount; break; case TimeStepUnit.Day: int currentday = Data.StartTime.Day; newvalues.Add(0); foreach (var v in Data.Items) { if (Data.GetTime(counter).Day == currentday) { if (v.Value != Data.DeleteValue) newvalues[newvalues.Count - 1] += v.Value; } else { currentday = Data.GetTime(counter).Day; if (!Accumulate) newvalues[newvalues.Count - 1] /= localcount; localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (!Accumulate) newvalues[newvalues.Count - 1] /= localcount; break; case TimeStepUnit.Hour: int currenthour = Data.StartTime.Hour; newvalues.Add(0); foreach (var v in Data.Items) { if (Data.GetTime(counter).Hour == currenthour) { if (v.Value != Data.DeleteValue) newvalues[newvalues.Count - 1] += v.Value; } else { currenthour = Data.GetTime(counter).Hour; if (!Accumulate) newvalues[newvalues.Count - 1] /= localcount; localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (!Accumulate) newvalues[newvalues.Count - 1] /= localcount; break; case TimeStepUnit.Minute: int currentminute = Data.StartTime.Minute; newvalues.Add(0); foreach (var v in Data.Items.Where(vv => vv.Value != Data.DeleteValue)) { if (Data.GetTime(counter).Minute == currentminute) { newvalues[newvalues.Count - 1] += v.Value; } else { currentminute = Data.GetTime(counter).Minute; if (!Accumulate) newvalues[newvalues.Count - 1] /= localcount; localcount = 0; newvalues.Add(v.Value); } localcount++; counter++; } if (!Accumulate) newvalues[newvalues.Count - 1] /= localcount; break; case TimeStepUnit.Second: break; case TimeStepUnit.None: break; default: break; } ToReturn.AddRange(newvalues.Select(n=>new ValueDouble(n))); return ToReturn; }
/// <summary> /// Changes the zoomlevel of a timespanseries /// </summary> /// <param name="Data"></param> /// <param name="NewZoomLevel"></param> /// <param name="Accumulate"></param> /// <returns></returns> public static IEnumerable<TimeSpanValue> ChangeZoomLevel(TimeSpanSeries Data, TimeStepUnit NewZoomLevel, bool Accumulate) { if (Data.TimeStepSize <= NewZoomLevel) return null; List<TimeSpanValue> ToReturn = new List<TimeSpanValue>(); DateTime start = Data.StartTime; DateTime end = Data.EndTime; TimeSpanValue CurrentValue = new TimeSpanValue(GetTimeOfFirstTimeStep(start, NewZoomLevel), GetTimeOfFirstTimeStep(start, NewZoomLevel).AddTimeStepUnit(NewZoomLevel), 0); double currentcount = 0; foreach (var v in Data.Items.Where(dv => dv.Value != Data.DeleteValue)) { if (CurrentValue.StartTime <= v.StartTime & v.StartTime<= CurrentValue.EndTime) { if (CurrentValue.EndTime >= v.EndTime) //We are still within the timespan { CurrentValue.Value += v.Value; currentcount++; } else //We exceed the timespan { double outsidefraction =(v.EndTime.Subtract(CurrentValue.EndTime).TotalDays / v.EndTime.Subtract(v.StartTime).TotalDays); CurrentValue.Value += v.Value*(1 - outsidefraction); currentcount += 1 - outsidefraction; if (!Accumulate & currentcount != 0) CurrentValue.Value /= currentcount; ToReturn.Add(CurrentValue); CurrentValue = new TimeSpanValue(CurrentValue.EndTime, CurrentValue.EndTime.AddTimeStepUnit(NewZoomLevel), v.Value*outsidefraction); currentcount = outsidefraction; } } else { if (!Accumulate & currentcount != 0) CurrentValue.Value /= currentcount; ToReturn.Add(CurrentValue); CurrentValue = new TimeSpanValue(GetTimeOfFirstTimeStep(v.StartTime, NewZoomLevel), GetTimeOfFirstTimeStep(v.StartTime, NewZoomLevel).AddTimeStepUnit(NewZoomLevel), v.Value); currentcount = 1; } } if (!Accumulate & currentcount != 0) CurrentValue.Value /= currentcount; ToReturn.Add(CurrentValue); return ToReturn; }
public static DateTime GetNextTime(DateTime Start, TimeStepUnit timespan) { switch (timespan) { case TimeStepUnit.Year: return Start.AddYears(1); case TimeStepUnit.Month: return Start.AddMonths(1); case TimeStepUnit.Day: return Start.AddDays(1); case TimeStepUnit.Hour: return Start.AddHours(1); case TimeStepUnit.Minute: return Start.AddMinutes(1); case TimeStepUnit.Second: return Start.AddSeconds(1); default: throw new Exception("TimeStepUnit not set"); } }