• 03.05.2024, 08:15
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Vorlage für stündliche Zeitreihe über ein Jahr gesucht

Sonntag, 12. April 2009, 12:24

Hi,

ich habe folgendes Problem:

Zur Auswertung von Wettermessdaten an Offshore-Standorten soll eine Zeitreihenanalyse gemacht werden. Dazu habe ich bereits eine Datenbank mit Messdaten verschiedener Stationen (insgesamt knapp 6 Millionen Messungen). Diese habe ich auch bereits versucht in Excel zu importieren (Makro/VBA), was im Prinzip auch klappt, nur leider sind die Messreihen unvollständig. Sprich Station XY hat einen Messausfall an 2 Tagen im Jahr, ein direkter Vergleich ist also nur schwer möglich, da in Zeile 3672 in Station A der Wert für den 03.06 um 3:00 Uhr angezeigt wird und bei Station B der 22. 06 um 14:00.

Ich suche deshalb eine Vorlage für eine stündliche Zeitreihe über ein Jahr hinweg, so dass man ungefair die folgende Struktur bekommt:

01 | 01 | 01
01 | 01 | 02

also monat, tag, stunde, und das für ein ganzes jahr. So kann ich dann die Daten den jeweiligen Stunden zuordnen, indem ich die Abfrage direkt über diese Spalten steuere-

Gibt es irgendwo eine solche Vorlage, muss nicht unbedingt Excel sein wenn mans irgendwie konvertieren kann.

Ein Jahr hat irgendwas um die 8760 Stunden, das alles von Hand zu tippen mit Schaltjahren etc. ist zu aufwendig.


Alternativ wäre auch möglich mit einem Script die Datenbank auf fehlende Messungen zu untersuchen und dort Nullwerte einzufügen, dass erscheint mir aber eher noch komplizierter.

Danke schonmal für alle Tipps
"When mountains speak, wise men listen" - John Muir

Sonntag, 12. April 2009, 13:35

kommst Du nicht schon mit dem Auto-Ausfüllen von Excel weiter?
wenn Du in zwei Zellen die ersten beiden Zeitpunkte einträgst (also mit 1h Differenz wenn ich Dich richtig verstanden habe) müsstest Du das doch dann bis unten relativ einfach erweitert bekommen

Sonntag, 12. April 2009, 13:45

realtiv einfach ist gut, das klappt nur für die 24h innerhalb eines tages, und man muss auch weiterhin auf monatslänge und schaltjahre aufpassen.

Geht im Prinzip schon, aber ist eben äusserst mühselig. Da das für mehrere Jahre gemacht werden muss wäre es schön da etwas verlässliches zu haben.

Das ganze muss zum glück nicht gleich bis morgen fertig werden, wichtiger ist eher die arbeitszeiteffizienz, sprich möglichst wenig Zeit insgesamt dafür verwenden (HiWi eben ;) )
"When mountains speak, wise men listen" - John Muir

Sonntag, 12. April 2009, 23:09

Wieso normalisierst du die Daten nicht und fügst die Datensätze in eine SQL Datenbank ein? Dann haste zumindest einen konsistenten Datenbestand, den du je nach Wunsch per PHP o.Ä. abfragen und vervollständigen kannst.

Gruß TrOuble

Montag, 13. April 2009, 11:51

Schritt 1 war das Anlegen der Datenbank. Also schnell mit JAVA ein kleines Tool zusammengehackt und ne MYSQL-Datenbank angelegt. Zugegeben, die ist jetzt nicht wirklich normalisiert, sondern besteht eigentlich nur aus einer Tabelle mit allen Messungen drin (also 5 Millionen Zeilen und 10 Spalten). Alleine das befüllen hat läppische 30h gedauert, das liegt aber vermutlich an meinem nicht gerade eleganten Programmierweg.

Dann habe ich die Daten mit VBA in Excel übertragen und dort Blätter generiert die die Daten eines Jahres enthalten. Erst dabei ist aufgefallen dass einige Werte nicht vorhanden sind.

Die große Frage ist also wie schaffe ich es

a) die fehlenden Daten (also Tage bzw. Stunden) direkt in der Datenbank mit Nullzeilen zu ergänzen

oder

b) direkt in Excel die vorhandenen Daten an die passende Stelle einzutragen.

Das ist wichtig damit später direkt verglichen werden kann.


Im Moment mache ich gerade folgendes als kleinen Test:

Ich habe in Excel die Zeitreihe für Januar 2006 angelegt, also 747 Zeilen für alle Stunden dieses Monats. Die 25 Datenspalten entsprechen den Stationen.

In VBA wir jetzt sozusagen für jedes einzelne Feld eine Abfrage gestartet, die genau den Datensatz zum Datum passend erfasst und einträgt.
Funktioniert zwar, ist aber unglaublich langsam, in sofern wäre es vermutlich besser doch irgendwie den Weg a) zu gehen und zu versuchen die Datenbank direkt aufzufüllen, dann kann man wenigstens Recordsets mit großer Länge verwenden und muss nicht jedes Feld einzeln machen. Das ist nämlich der Punkt der wirklich Zeit frisst, Erstellen des Recordsets
"When mountains speak, wise men listen" - John Muir

Montag, 13. April 2009, 12:11

Ist evntuell rrdtool was für dich?

Montag, 13. April 2009, 12:24

interessante Geschichte, allerdings wohl eher für den Messstationenbetreiber als für mich, leider. Trotzdem danke für den Tipp.

Das ganze muss am Ende leider in Excel enden, nicht unbedingt meine Entscheidung, aber da lässt sich nicht viel machen.
"When mountains speak, wise men listen" - John Muir

Dienstag, 14. April 2009, 20:22

Da führen doch wie immer viele Wege zum Ziel:

Entweder per Excel mit VBA oder dem kranken Sverweis.
Oder wenn Du (etwas) programmieren kannst, dann kannst Du auch einen Tages-/Stunden-Iterator bauen, der Dir eine Zeit Tabelle per JDBC befüllt.
Dann einfach per outer join auslesen und ins Excelfile hauen...

Tante Edith bietet Schützenhilfe: GregorianCalendar Objekt des Startdatums anlegen, dann immer add(Calendar.HOUR, 1) eine Stunde drauf, und SQL Statement bilden.

Dann nachher entsprechend auslesen: SELECT * FROM MESSERGEBNISSE m LEFT OUTER JOIN ZEIT z ON z.DATUM_UHRZEIT = m.MESSZEITPUNKT

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DrStrange« (14. April 2009, 20:25)

When you come across a big kettle of crazy, it's best not to stir it.

Muhahahahahaha, pwned du kacknoob!
*gockel gockel boaarrcck*

Mittwoch, 15. April 2009, 16:56

merci,

das klingt nach ner guten Idee.

VBA hat nicht funktioniert, prinzipiell zwar schon, aber das hätte eine Bearbeitungszeit von 90 Tagen für das Programm bedeutet.

werd das mal versuchen mit outer join, in der hoffnung dass das dann schneller geht.


edit:

einzige frage ist wie wandle ich die tabellenspalten mit den datumsangaben in ein timestamp um

(jaja, ich google ja schon...)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Lev« (15. April 2009, 16:57)

"When mountains speak, wise men listen" - John Muir

Samstag, 18. April 2009, 00:40

Was für eine Datenbank ist es denn?
Willst Du das Datenformat in der Tabellenstruktur ändern, oder willst Du beim Auslesen konvertieren?
Oder willst Du mehrere Spalten kombinieren? *confused*
When you come across a big kettle of crazy, it's best not to stir it.

Muhahahahahaha, pwned du kacknoob!
*gockel gockel boaarrcck*

Samstag, 18. April 2009, 15:57

MySQL Datenbank

Tabelle momentan:

jahr | monat | tag | stunde | minute | Messwert1 | Messwert 2 | Messwert 3 |
---------------------------------------------------------------------------------------------------------------

soll überführt werden in:

timestamp | messwert1 | messwert2 | messwert3
-------------------------------------------------------------------------


Also im Prinzip einfach aus 5 Spalten eine Spalte als Timestamo generieren.

Bin gerade am recherchieren ob ich das direkt mit SQL gebacken bekomme oder ob ich wieder den Umweg über JAVA gehen muss.


Wenn das geschafft ist funktionierts ja wie du bereits gesagt hast durch Vergleich mit einer "vollständigen" timestamp reihe
"When mountains speak, wise men listen" - John Muir

Sonntag, 19. April 2009, 13:40

Mit MySQL bin ich total aus der Übung.
Mit Oracle würde ich es wie folgt machen:

MySQL-Abfrage(n)

1
select to_timestamp ( jahr || monat || tag || stunde || minute , 'YYYYMMDDHH24MI' ) from tabelle.


Also konkatenieren, und per Pattern in einen Timestamp hauen.
Geht mit MySQL garantiert auch (Concat etc.)

Wenn Du das as echten Timestamp Wert ablegen möchtest:

MySQL-Abfrage(n)

1
2
3
4
create table tab_neu as
(
select to_timestamp ( jahr || monat || tag || stunde || minute , 'YYYYMMDDHH24MI' ) as zeitpunkt, messwert1, messwert2, messwert3 from tabelle
)


Oder: neue Spalte anlegen, und dann per UPDATE statement.

Hope that helps!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DrStrange« (19. April 2009, 13:41)

When you come across a big kettle of crazy, it's best not to stir it.

Muhahahahahaha, pwned du kacknoob!
*gockel gockel boaarrcck*