2015-12-08 3 views
6

Ich habe Google-Tabelle mit folgenden DatenFill Daten durch Interpolation in Google-Tabelle fehlt

A   B  D 
1 Date  Weight Computation 
2 2015/12/09   =B2*2 
3 2015/12/10 65  =B3*2 
4 2015/12/11   =B4*2 
5 2015/12/12   =B5*2 
6 2015/12/14 62  =B6*2 
7 2015/12/15   =B7*2 
8 2015/12/16 61  =B8*2 
9 2015/12/17   =B9*2 

ich das Gewicht grafisch darstellen möchten w.r.t. Datum und/oder verwenden Sie es mit anderen Spalten, die andere Mengen aus dem Gewicht berechnen. Sie werden jedoch bemerken, dass einige Einträge fehlen. Was ich will, ist eine weitere Spalte, die Daten aufweist, die auf dem Gewicht Spalte mit fehlenden Werten basiert interpoliert und ausgefüllt. ZB:

A   B  C  D 
1 Date  Weight WeightI Computation 
2 2015/12/09   65  =C2*2   # use first known value 
3 2015/12/10 65  65  =C3*2 
4 2015/12/11   64  =C4*2   # =(62-65)/3*(1)+65 
5 2015/12/12   63  =C5*2   # =(62-65)/3*(2)+65 
6 2015/12/14 62  62  =C6*2 
7 2015/12/15   61.5 =C7*2   # =(61-62)/2*(1)+62 
8 2015/12/16 61  61  =C8*2 
9 2015/12/17   61  =C9*2   # use the last known value 

In Spalte C werden in durch lineare Interpolation gefüllt Werte, wenn ich Daten zu finden, fehlt zwischen zwei bekannten Punkten.

Ich glaube, das ist ein wirklich einfacher und häufiger Anwendungsfall, also bin ich mir sicher, dass es eine triviale Sache zu tun ist, aber ich bin nicht in der Lage, eine Lösung mit eingebauten Funktionen zu finden. Ich habe auch nicht viel Erfahrung mit Tabellenkalkulationen. Ich habe Stunden damit verbracht, mit = INDEX, = MATCH, = SVERWEIS, = RELEASE, = TREND usw. zu experimentieren, aber ich bin nicht in der Lage, etwas aus den Beispielen zu finden. Die einzige Lösung, die ich verwenden konnte, war eine benutzerdefinierte Funktion mit Google Apps Script zu erstellen. Obwohl meine Lösung funktioniert, scheint sie wirklich sehr langsam auszuführen. Meine Tabelle ist auch riesig.

Irgendwelche Hinweise, Lösungen?

+0

Sie könnten besser dran, nehmen Sie den Code für die benutzerdefinierte Funktion geschrieben, und ändern es von einem 'onEdit()' Trigger oder etwas ähnliches zu laufen. Die Funktionen berechnen wahrscheinlich die gesamte Tabelle jedes Mal neu, wenn sich eine Änderung ergibt. Ein 'onEdit()' -Trigger kann ein Skript ausführen, das nur den Wert in der im Skript angegebenen Zelle ändert. Vielleicht möchten Sie sich die [Link zu Google Tabellen Veranstaltungen] (https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events) -Dokumentation ansehen. –

Antwort

4

eine Lösung gefunden, die mit den meisten meiner Anforderungen erfüllt:

  1. Verwendet =FILTER(), um zuerst Leerzeilen zu entfernen, wo Daten nicht verfügbar sind (Danke für einen Tipp von "Pnuts").

  2. Und =MATCH() nach zwei aufeinanderfolgenden Zeilen aus der gefilterten Tabelle suchen. In meinem Fall konnte ich diese Funktion verwenden, da Spalte A sortiert ist und keine Wiederholungen hat.

  3. Und dann mit Zeilenformel interpolieren Werte.

So wird das Ausgangssignal:

A   B  C   D  E 
1 Date   Weight FDdate  FWeight IWeight 
2 2015/05/09   2015/05/10 65.00 #N/A 
3 2015/05/10 65.00 2015/05/13 62.00 65.00 
4 2015/05/11   2015/05/15 61.00 64.00 
5 2015/05/12        63.00 
6 2015/05/13 62.00      62.00 
7 2015/05/14        61.50 
8 2015/05/15 61.00      61.00 
9 2015/05/16        61.00 
10 2015/05/17        61.00 

Wo Zellen C2 und D2 die folgenden Bereich Formel (kleine Anmerkung: die folgenden Formeln natürlich kombiniert werden könnten, wenn Spalten A und B benachbart sind):

C2 =FILTER($A$2:$A$10, NOT(ISBLANK($B$2:$B$10))) 
D2 =FILTER($B$2:$B$10, NOT(ISBLANK($B$2:$B$10))) 

Zellen E2 durch E10 enthalten Die folgende Zeile Interpolationsformel: [y = y1 + (y2 - y1)/(x2 - x1) * (x - x1)]:

E2 =(INDEX($D:$D, MATCH($A2, $C:$C, 1),  1)) 
    +(INDEX($D:$D, MATCH($A2, $C:$C, 1) + 1, 1) 
    - INDEX($D:$D, MATCH($A2, $C:$C, 1),  1)) 
    /(INDEX($C:$C, MATCH($A2, $C:$C, 1) + 1, 1) 
    - INDEX($C:$C, MATCH($A2, $C:$C, 1),  1)) 
    *(INDEX($C:$C, MATCH($A2, $C:$C, 1),  1) - $A2) * -1 

Was diese Lösung funktioniert nicht, wenn für die erste Zelle B2 keinen Wert hat, wobei die Formel in Folge # N/A. All dies wäre viel effizienter gewesen, wenn wir etwas wie =INTERPOLATE_LINE(A2, $A$2:$A$10, $B$2:$B$10) in Google Tabellenkalkulation hätten, aber leider existiert das nicht. Bitte korrigieren Sie mich, wenn ich es in meiner Lesung der supported functions in Google Tabellenkalkulation verpasst habe.

+0

Clevere Lösung, danke! – electronpusher

7

Sie könnten forecast verwenden, für die es bequemer sein könnte, zuerst die Daten, die Sie lesen, von denen zu trennen, die Sie nicht haben (und später neu anordnen). Also mit nur drei Lesungen sagen:

 A  B 
1 10/12/2015 65 
2 14/12/2015 62 
3 16/12/2015 61 

und die Termine für die Werte unten auf der linken Seite erforderlich sind:

6 09/12/2015 65.6 
7 11/12/2015 64.3 
8 12/12/2015 63.6 
9 15/12/2015 61.5 
10 17/12/2015 60.2 

Die Formel von dort nach 65.6 in B6 (und kopiert bis zu geben Anlass passen) ist:

=forecast(A6,$B$1:$B$3,$A$1:$A$3) 

Dies ist in der ziemlich Weise zeigen nicht berechnet man aber durch Extrapolation der fehlenden Endwerte insbesondere etwas genauer betrachtet werden kann, r ather als nur ihren nächsten verfügbaren Wert zu wiederholen.

Nachdem Sie die Werte berechnet haben, möchten Sie wahrscheinlich die Daten in der Datumsreihenfolge wieder zusammensetzen. Also schlage ich vor, Kopie B6: B10 und Edit, Paste special, Einfügen Werte nur über die Oberseite und dann sortieren, um zu passen.

Die Tabelle unten vergleicht die Ergebnisse oben (blau) mit denen in Ihrem OP (grün) und markiert die gegebenen Datenpunkte:

SO34150309 example

+1

Ich kann den Wert von 'forcast()' sehen, aber in meinen Experimenten fand ich, dass es als eine einzelne gerade Linie über den gesamten Datenbereich passt interpoliert. Es wird also nicht durch Punkte geführt, wo Daten bereits verfügbar sind. Idealerweise hätte ich mir gewünscht, wenn ich anstelle einer Geradeninterpolation eine Spline-Anpassung verwenden könnte. –

1

Ich fand eine Lösung, die die Anforderungen vollständig erfüllt. Ich benutzte ein separates Blatt, damit ich die Rechnung in Stücke aufteilen konnte.

Erstellen Sie ein neues Blatt. Geben Sie die folgenden Formeln in Zellen A2-F2 ein, und kopieren Sie sie dann auf der Seite nach unten.

  1. Zelle A2: Kopieren Sie Ihre Gewichtsdaten in der ersten Spalte. (In diesem Beispiel wird der Blattname ist Daily Record und die Gewichte werden in Spalte D aufgezeichnet)

    'Daily Record'!D2

  2. Zelle B2: Finden Sie das letzte aufgezeichnete Gewicht.

    =INDEX(FILTER(A$2:A2,A$2:A2 <> ""),COUNT(FILTER(A$2:A2,A$2:A2 <> "")),1)

  3. Zelle C2: Zählen Sie die Anzahl der Tage seit dem letzten Wiegen.

    =IF(A2<>"",0,IF(ROW(C2)<3,0,C1+1))

  4. Zelle D2: (. Vom aktuellen Datum oder höher) Suche das nächste aufgezeichnete Gewicht

    =IFERROR(INDEX(FILTER(A2:A,A2:A <> ""),1,1),"")

  5. Zelle E2: Zähle die Anzahl der Tage, bis das nächste Wiegen.

    =IF(A2<>"",0,IF(E3="","",E3+1))

  6. Zelle F2: das interpoliert Gewicht berechnen.

    =IF(A2 <> "", A2, IF(D2 = "", "", B2 + (D2-B2)*C2/(C2+E2)))