golang timeseries Resample
时间: 2023-09-29 22:10:56 浏览: 71
在 Golang 中,可以使用一些库来对时间序列进行重新采样。其中比较常用的是 `gonum.org/v1/plot/plotter` 和 `github.com/montanaflynn/stats`。
`gonum.org/v1/plot/plotter` 提供了 `XYValues` 和 `XYs` 两种数据类型来存储时间序列数据,可以使用 `gonum.org/v1/plot/plotutil` 中的 `Resample` 函数来进行重新采样。例如,将一个时间序列数据从每秒钟采样降低到每分钟采样可以这样实现:
```
import (
"time"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/plotutil"
)
func resampleXYValues(data plotter.XYValues, interval time.Duration) plotter.XYValues {
resampled := make(plotter.XYValues, 0, len(data))
start := data[0].X
end := data[len(data)-1].X
for t := start; t.Before(end); t = t.Add(interval) {
var sumX, sumY float64
var count int
for _, p := range data {
if p.X.After(t) && p.X.Before(t.Add(interval)) {
sumX += p.X.UnixNano()
sumY += p.Y
count++
}
}
if count > 0 {
resampled = append(resampled, plotter.XY{X: time.Unix(0, int64(sumX)/int64(count)), Y: sumY / float64(count)})
}
}
return resampled
}
func main() {
data := plotter.XYValues{
{X: time.Now().Add(-time.Hour), Y: 10},
{X: time.Now().Add(-30 * time.Minute), Y: 20},
{X: time.Now().Add(-15 * time.Minute), Y: 30},
{X: time.Now(), Y: 40},
}
interval := time.Minute
resampled := resampleXYValues(data, interval)
plotutil.NewScatter(resampled).Save(4*vg.Inch, 4*vg.Inch, "resampled.png")
}
```
`github.com/montanaflynn/stats` 提供了 `stats.Float64Data` 数据类型来存储时间序列数据,可以使用 `stats.Sample` 和 `stats.SampleInterpolation` 函数来进行重新采样。例如,将一个时间序列数据从每秒钟采样降低到每分钟采样可以这样实现:
```
import (
"time"
"github.com/montanaflynn/stats"
)
func resampleFloat64Data(data stats.Float64Data, interval time.Duration) stats.Float64Data {
resampled := make(stats.Float64Data, 0, len(data))
start := data[0]
end := data[len(data)-1]
for t := start; t.Before(end); t = t.Add(interval) {
subset, _ := data.Window(t, t.Add(interval))
if len(subset) > 0 {
value, _ := stats.Mean(subset)
resampled = append(resampled, value)
}
}
return resampled
}
func main() {
data := stats.Float64Data{10, 20, 30, 40}
interval := time.Minute
resampled := resampleFloat64Data(data, interval)
// Do something with resampled data
}
```
阅读全文