package timeseries import ( "math" "sort" "time" ) // Aligns point's time stamps according to provided interval. func (ts TimeSeries) Align(interval time.Duration) TimeSeries { if interval <= 0 || ts.Len() < 2 { return ts } alignedTs := NewTimeSeries() var frameTs = ts[0].GetTimeFrame(interval) var pointFrameTs time.Time var point TimePoint for i := 0; i < ts.Len(); i++ { point = ts[i] pointFrameTs = point.GetTimeFrame(interval) if pointFrameTs.After(frameTs) { for frameTs.Before(pointFrameTs) { alignedTs = append(alignedTs, TimePoint{Time: frameTs, Value: nil}) frameTs = frameTs.Add(interval) } } alignedTs = append(alignedTs, TimePoint{Time: pointFrameTs, Value: point.Value}) frameTs = frameTs.Add(interval) } return alignedTs } // Detects interval between data points in milliseconds based on median delta between points. func (ts TimeSeries) DetectInterval() time.Duration { if ts.Len() < 2 { return 0 } deltas := make([]int, 0) for i := 1; i < ts.Len(); i++ { delta := ts[i].Time.Sub(ts[i-1].Time) deltas = append(deltas, int(delta.Milliseconds())) } sort.Ints(deltas) midIndex := int(math.Floor(float64(len(deltas)) * 0.5)) return time.Duration(deltas[midIndex]) * time.Millisecond }