Last active
June 29, 2016 19:33
-
-
Save joneskoo/89f8931ad2bb0acad6ecc9e8ffd7a571 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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