Align time series data if possible
This commit is contained in:
52
pkg/timeseries/align.go
Normal file
52
pkg/timeseries/align.go
Normal file
@@ -0,0 +1,52 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user