Skip to content

Instantly share code, notes, and snippets.

@joneskoo
Last active June 29, 2016 19:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joneskoo/89f8931ad2bb0acad6ecc9e8ffd7a571 to your computer and use it in GitHub Desktop.
Save joneskoo/89f8931ad2bb0acad6ecc9e8ffd7a571 to your computer and use it in GitHub Desktop.
package main
import (
"encoding/csv"
"fmt"
"io"
"log"
"os"
"strconv"
"time"
)
type timeFixer struct {
prev time.Time
adjustment time.Duration
}
func (t *timeFixer) parseBrokenTime(s string) (ts time.Time, err error) {
localTs, err := strconv.ParseInt(s, 10, 64)
if err != nil {
return
}
// Fix time
realTs := time.Unix(localTs, 0).Add(-2 * time.Hour).UTC()
diff := realTs.Sub(t.prev)
t.prev = realTs
switch diff {
case 0 * time.Hour:
// DST backward; following data in standard time
fmt.Printf("WARN: Detected DST backward shift %v\n", realTs)
t.adjustment = 0 * time.Hour
//realTs = realTs.Add(-1 * time.Hour)
case 1 * time.Hour:
// Normal case
case 2 * time.Hour:
// DST forward, following data in summer time
t.adjustment = 1 * time.Hour
fmt.Printf("WARN: Detected DST forward shift %v\n", realTs)
default:
fmt.Printf("WARN: Records missing, now %v %v\n", realTs, diff)
_, offset := realTs.Local().Zone()
t.adjustment = time.Duration(offset/3600-2) * time.Hour
fmt.Printf("WARN: Offset now %v\n", t.adjustment)
}
realTs = realTs.Add(-t.adjustment)
return realTs, nil
}
func main() {
file, err := os.Open("power.csv") // For read access.
if err != nil {
log.Fatal(err)
}
defer file.Close()
r := csv.NewReader(file)
var fixer timeFixer
for {
record, err := r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
if len(record) != 2 {
log.Fatal("Invalid file format, expected two columns")
}
ts, err := fixer.parseBrokenTime(record[0])
if err != nil {
log.Fatal(err)
}
fmt.Println(ts, record[1])
}
}
[joneskoo@grant energiatili]$ go run reader.go power.csv |grep WARN
WARN: Records missing, now 2011-12-31 22:00:00 +0000 UTC 2562047h47m16.854775807s
WARN: Offset now 0
WARN: Detected DST forward shift 2012-03-25 02:00:00 +0000 UTC
WARN: Records missing, now 2014-09-02 22:00:00 +0000 UTC 18265h0m0s
WARN: Offset now 1h0m0s
WARN: Detected DST backward shift 2014-10-26 01:00:00 +0000 UTC
WARN: Detected DST forward shift 2015-03-29 02:00:00 +0000 UTC
WARN: Detected DST backward shift 2015-10-25 01:00:00 +0000 UTC
WARN: Detected DST forward shift 2016-03-27 02:00:00 +0000 UTC
[joneskoo@grant energiatili]$ go run reader.go power.csv |grep -v '0$'|tail -n 20
2016-06-27 02:00:00 +0000 UTC 1.097
2016-06-27 03:00:00 +0000 UTC 0.261
2016-06-27 04:00:00 +0000 UTC 1.145
2016-06-27 05:00:00 +0000 UTC 1.045
2016-06-27 06:00:00 +0000 UTC 0.879
2016-06-27 07:00:00 +0000 UTC 1.438
2016-06-27 08:00:00 +0000 UTC 1.352
2016-06-27 09:00:00 +0000 UTC 1.6
2016-06-27 10:00:00 +0000 UTC 0.885
2016-06-27 11:00:00 +0000 UTC 0.267
2016-06-27 12:00:00 +0000 UTC 0.85
2016-06-27 13:00:00 +0000 UTC 0.528
2016-06-27 14:00:00 +0000 UTC 0.395
2016-06-27 15:00:00 +0000 UTC 1.806
2016-06-27 16:00:00 +0000 UTC 1.036
2016-06-27 17:00:00 +0000 UTC 1.42
2016-06-27 18:00:00 +0000 UTC 1.015
2016-06-27 19:00:00 +0000 UTC 0.355
2016-06-27 20:00:00 +0000 UTC 1.021
2016-06-27 21:00:00 +0000 UTC 0.358
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment