Skip to content

Instantly share code, notes, and snippets.

@freman
Created October 23, 2016 11:18
Show Gist options
  • Save freman/fc01342d3616c2602cbb73c5479d148a to your computer and use it in GitHub Desktop.
Save freman/fc01342d3616c2602cbb73c5479d148a to your computer and use it in GitHub Desktop.
Bucket stats based on a start and end time
package main
import (
"bufio"
"flag"
"fmt"
"os"
"strings"
"time"
"github.com/montanaflynn/stats"
)
const timeFormat = "15:04:05"
var windowSize = time.Minute
type window struct {
started int
ongoing int
ended int
durations []float64
}
func main() {
finFile := flag.String("in", "", "Input file")
flag.Parse()
if *finFile == "" {
flag.Usage()
return
}
file, err := os.Open(*finFile)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
times := []time.Time{}
windows := make(map[time.Time]*window)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
beginend := strings.Split(scanner.Text(), " ")
startTime, err := time.Parse(timeFormat, beginend[0])
if err != nil {
panic(err)
}
endTime, err := time.Parse(timeFormat, beginend[1])
if err != nil {
panic(err)
}
beginWindow := startTime.Truncate(windowSize)
endWindow := endTime.Add(windowSize).Truncate(windowSize)
for i := beginWindow; i.Before(endWindow); i = i.Add(windowSize) {
if _, ok := windows[i]; !ok {
times = append(times, i)
windows[i] = &window{}
windows[i].durations = []float64{}
}
if i == beginWindow {
windows[i].durations = append(windows[i].durations, endTime.Sub(startTime).Seconds())
windows[i].started++
} else if i == endWindow {
windows[i].ended++
} else {
windows[i].ongoing++
}
}
}
if err := scanner.Err(); err != nil {
fmt.Println(err)
return
}
for _, time := range times {
bucket := windows[time]
var max, min, stddev, mean float64
if bucket.started > 0 {
max, _ = stats.Max(bucket.durations)
min, _ = stats.Min(bucket.durations)
stddev, _ = stats.StandardDeviation(bucket.durations)
mean, _ = stats.Mean(bucket.durations)
}
fmt.Printf("%s,%d,%d,%d,%f,%f,%f,%f\n",
time.Format(timeFormat),
bucket.started,
bucket.ongoing,
bucket.ended,
min,
max,
mean,
stddev)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment