X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altoslib%2FAltosTimeSeries.java;h=b3c432fcf565e1b481d63e0025024334a8d90061;hb=2969f0af52dfbdea7593b208e510c7b17227064c;hp=db33fafa56a088c1e05910229fb7029802da13c5;hpb=c9e82a5929a836bc61b464507badef2df5e9d4d0;p=fw%2Faltos diff --git a/altoslib/AltosTimeSeries.java b/altoslib/AltosTimeSeries.java index db33fafa..b3c432fc 100644 --- a/altoslib/AltosTimeSeries.java +++ b/altoslib/AltosTimeSeries.java @@ -12,15 +12,19 @@ * General Public License for more details. */ -package org.altusmetrum.altoslib_11; +package org.altusmetrum.altoslib_12; import java.util.*; -public class AltosTimeSeries implements Iterable { +public class AltosTimeSeries implements Iterable, Comparable { public String label; public AltosUnits units; ArrayList values; + public int compareTo(AltosTimeSeries other) { + return label.compareTo(other.label); + } + public void add(AltosTimeValue tv) { values.add(tv); } @@ -146,30 +150,47 @@ public class AltosTimeSeries implements Iterable { return min; } + public AltosTimeValue first() { + return values.get(0); + } + + public AltosTimeValue last() { + return values.get(values.size() - 1); + } + public double average() { - double total = 0; - int count = 0; + double total_value = 0; + double total_time = 0; + AltosTimeValue prev = null; for (AltosTimeValue tv : values) { - total += tv.value; - count++; + if (prev != null) { + total_value += (tv.value + prev.value) / 2 * (tv.time - prev.time); + total_time += (tv.time - prev.time); + } + prev = tv; } - if (count == 0) + if (total_time == 0) return AltosLib.MISSING; - return total / count; + return total_value / total_time; } public double average(double start_time, double end_time) { - double total = 0; - int count = 0; + double total_value = 0; + double total_time = 0; + AltosTimeValue prev = null; for (AltosTimeValue tv : values) { if (start_time <= tv.time && tv.time <= end_time) { - total += tv.value; - count++; + if (prev != null) { + total_value += (tv.value + prev.value) / 2 * (tv.time - start_time); + total_time += (tv.time - start_time); + } + start_time = tv.time; } + prev = tv; } - if (count == 0) + if (total_time == 0) return AltosLib.MISSING; - return total / count; + return total_value / total_time; } public AltosTimeSeries integrate(AltosTimeSeries integral) {