Dataset mit Datum

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
pixewakb
User
Beiträge: 1405
Registriert: Sonntag 24. April 2011, 19:43

Ich denke, dass ich die Frage schon mal ansatzweise gestellt habe. Ich habe jetzt ein Modul neu geschrieben, dass ein Dataset auf der Festplatte schreibt und dort damit arbeiten kann. Das Modul besteht ausschließlich aus Funktionen.

Jedes Dataset verfügt über eine Spalte mit Datumsangaben, die ich aktuell als String lade. Ich überlege die Datumsstrings in ein datatime.date-Objekt zu verwandeln und dann so vorzuhalten. Die Werte je Datum speichere ich in einem Wörterbuch mit dem Datum (dann datetime.date-Objekt) als Schlüssel. Spricht aus eurer Sicht etwas gegen die Umwandlung der Datumswerte in ein datetime.date-Objekt!?

Ich beabsichtige die Umwandlung, ich will mich nur noch mal rückversichern, weil ich später das Modul massig einsetzen muss. Eine spätere Änderung wäre dann übel...
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@pixewakb
Was soll man dazu sagen, außer: Das kommt darauf an? Wenn Du das Wörterbuch z. B. nach Datumswerten sortiert ausgeben möchtest, dann bietet sich `datetime` sicherlich an. Die nächste Frage für mich wäre dann allerdings, ob ein Wörterbuch grundsätzlich der passende Datentyp ist. Wenn Du lediglich auf die Werte des Wörterbuchs zugreifst, sehe ich keinen Mehrwert in einer Umwandlung.

Aber wie gesagt: Ohne zu wissen, was Du Dir von einer Umwandlung versprichst, lässt sich Deine Frage nicht beantworten.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
pixewakb
User
Beiträge: 1405
Registriert: Sonntag 24. April 2011, 19:43

Ehrlich gesagt hatte ich vermutet, dass es eine state of the art-Lösung gibt. Bei Bedarf kann ich m. E. auch die date-Strings in datetime.date-Objekte umwandeln und umgekehrt, also ist es da relativ egal, wie mir scheint. Sagen wir mal es sieht wie folgt aus:

2016-05-02;5
2016-05-03;8
2016-05-04;8
2016-05-05;0
2016-05-06;8
2016-05-09;5
2016-05-10;8
2016-05-11;8
2016-05-12;0
2016-05-13;8

Konkret lade ich die Datumswerte separat in eine Liste und habe dazu ein Wörterbuch. Konkret: Ich hole mir die keys zum Wörterbuch, wandle sie in eine Liste um, sortiere die Liste (so wie ich es gerade brauche) und stelle dann mit den Werten je Datum Berechnungen an. In der Datumsliste habe ich Lücken (Feiertage, Urlaub usw.), so dass ich nicht einfach einen Tag hinzufügen kann, sondern tatsächlich über die Datumswerte iterieren musss. (Mit Datumsstrings habe ich es bereits implementiert.)

Sagen wir mal, ihr hättet obige Daten und müsstet einen Datentyp wählen. Interessant sind die Werte je Datum, nicht das Datum selbst, was nur als Schlüssel (Zugriffsmöglichkeit auf die Daten) fungiert. Wir würdet ihr das machen und wie - im Grundsatz - implementieren?
BlackJack

@pixewakb: Also wenn irgendwo ein `datetime`-Objekt gebraucht wird, dann würde ich die gleich beim Einlesen in solche umwandeln. Nur wenn ganz sicher ist, dass man immer nur die Zeichenkettendarstellung benötigt, würde ich es als Zeichenketten belassen. Wahrscheinlich nicht einmal dann. Bei Bedarf in `datetime` umwandeln *und umgekehrt* klingt gar nicht gut. Daten sollte man so früh wie möglich in das Format wandeln mit dem gearbeitet wird und nicht bei Bedarf im Programm immer hin und her wandeln. Das wird unübersichtlich und fehleranfällig.

Kommt Pandas eventuell in Frage? Statt sich das selbst zu programmieren?

Edit: Wobei ich den Sinn des Wörterbuchs hier nicht verstehe‽ Warum reicht keine Liste mit Datum und Werten, zum Beispiel als Liste oder Tupel, als Elemente? Sortiert sind die Datumsangaben ja schon. Falls nicht, kann man das ja auch mit einer Liste mit Listen/Tupeln ganz einfach tun.
bb1898
User
Beiträge: 199
Registriert: Mittwoch 12. Juli 2006, 14:28

BlackJack hat geschrieben:Edit: Wobei ich den Sinn des Wörterbuchs hier nicht verstehe‽ Warum reicht keine Liste mit Datum und Werten, zum Beispiel als Liste oder Tupel, als Elemente? Sortiert sind die Datumsangaben ja schon. Falls nicht, kann man das ja auch mit einer Liste mit Listen/Tupeln ganz einfach tun.
Bisher ist in dem Thread noch gar nicht die Rede davon gewesen, ob und wie oft einzelne Datensätze anhand des Datums herausgefischt werden sollen. Das scheint mir doch wesentlich für die Frage, ob eine Liste es genau so tut wie ein Dictionary oder vielleicht sogar besser.
Benutzeravatar
pixewakb
User
Beiträge: 1405
Registriert: Sonntag 24. April 2011, 19:43

Ich muss relativ häufig Werte nach Datum vergleichen. Bislang kam ich mit einem Datumsstring immer gut zurecht, meine ich. Ich denke gerade nach. Ich kann nicht abschätzen, ob ich später in Probleme hereinlaufe, wenn ich Weg 1 oder Weg 2 wähle. Ich schaue gerade ins Modul, mit dem ich Daten lade und verarbeite.

Pandas nutze ich unter der Haube schon etwas. Im Moment komme ich ohne pandas noch gut zurecht, sehe aber noch nicht, wie ich einzelne Aufgaben, die ich aktuell sehr gut bearbeiten kann, dann mit pandas lösen könnte. Das schreckt mich noch von pandas ab - ich merke an, dass ich seit 2014 (?) sehr viel, sehr umfassend modernisiert habe.

Ich überlege noch und gucke noch in den Quelltext.
bb1898
User
Beiträge: 199
Registriert: Mittwoch 12. Juli 2006, 14:28

pixewakb hat geschrieben:Ich muss relativ häufig Werte nach Datum vergleichen. Bislang kam ich mit einem Datumsstring immer gut zurecht, meine ich. Ich denke gerade nach. Ich kann nicht abschätzen, ob ich später in Probleme hereinlaufe, wenn ich Weg 1 oder Weg 2 wähle. Ich schaue gerade ins Modul, mit dem ich Daten lade und verarbeite.
Mit datetime.date kannst Du natürlich mehr machen: nicht nur sehen, dass Datum A vor Datum B liegt, sondern die Differenz ausrechnen, alle Einträge finden, die höchstens eine Woche vor oder nach Datum A liegen, usw. usf. Und die Daten in anderer Form ausgeben.
Benutzeravatar
pixewakb
User
Beiträge: 1405
Registriert: Sonntag 24. April 2011, 19:43

Ich bin blöd, aber manchmal fällt dann auch bei mir mal der Groschen :P

Ich habe ein Modul, was sauber arbeitet und hatte bis gerade geglaubt, dass ich es umformen, d. h. wegwerfen und neu schreiben müsste, was mich wohl um Wochen zurückgeworfen hätte.

Ich werde das jetzt anders lösen und neben der load-Funktion, die das Dataset im Projekt bereitstellt eine Funktion load2 schreiben, die die Datumswerte als datetime.date-Objekte zurückgibt. Aktuell kann ich noch nicht abschätzen, dass ich das tatsächlich breit brauche, falls ich es brauche, kann ich wahlweise darauf zugreifen.

Bitte bei mir immer berücksichtigen, dass ich kein Programmierer oder Informatiker bin. Ich nutze Python inzwischen zur Arbeit an Datensätzen und zur automatischen Auswertung selbiger, ich möchte es möglichst gut machen, weil ich sonst später feststelle, dass die einfache Lösung mir Bei-Probleme beschert, vereinzelt stelle ich aber immer wieder fest, dass mir die Grundlagen fehlen, um Sachverhalte korrekt einschätzen zu können, was dann möglicherweise zu absonderlichen Ansichten führt. Das ist meinerseits keine böse Absicht!
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@pixewakb
Ich hab' den Eindruck, dass Du Dir zu viele Gedanken über Probleme machst, die momentan noch überhaupt nicht existieren. Wenn Dein Modul das macht, für das Du es geschrieben hast, dann ist das doch ok. Wenn Du Daten im Stringformat vergleichst und zu einem richtigen Ergebnis kommst, warum denkst Du dann über ein anderes Format nach?
Und heute bereits eine "Funktion load2" zu schreiben, die Du eventuell einmal brauchen könntest, halte ich gelinde gesagt für Zeitverschwendung.

Aber vielleicht willst Du ja auch mal Deinen Code hier zeigen und beschreiben, was Du für Refactoringfantasien hast…?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
Natrix natrix
User
Beiträge: 16
Registriert: Mittwoch 29. März 2017, 09:16

Hallo Froum.

Thema passt hier einigermaßen, daher habe ich keinen neuen Faden eröffnet.

Ich habe ein PandasDF, dass einige Rohstoffpreise auflistet. Im Ursprung sind die Datumsangaben als String. Ich brauche das Datum aktuell nicht wirklich sondern nutze es v.a um die verschiedenen Spalten über join zusammenzuziehen.

Code: Alles auswählen

df1 = pd.read_table("d:\\data\\Blei.csv", decimal=b',' , sep= ";", index_col=0)   
df2 = pd.read_table("d:\\data\\Zinn.csv",   decimal=b',' , sep= ";", index_col=0)   
df3 = pd.read_table("d:\\data\\Kupfer.csv", decimal=b',' , sep= ";", index_col=0)   

all = df1.join(df2)
all = all.join(df3)
all.tail(8)
Die Tabelle wird sauber aufgebaut.

Code: Alles auswählen

			Blei 			Zinn 			Kupfer
Datum 			
06.12.2004 	976.15 		8739.40 		3092.0
02.12.2004 	968.11 		8761.46 		3217.0
01.12.2004 	1000.25 		8812.29 		3246.5
30.11.2004 	981.36 		8730.13 		3262.0
10.03.2004 	869.75 		NaN 			2867.0
03.02.2004 	813.50 		NaN 			2547.5
08.01.2004 	752.50 		NaN 			2337.0
20.11.2003 	602.50 		NaN 			1996.0
Ich möchte einige Grafiken machen und das String-Object konnte ich nicht als Achsen-Beschriftung ziehen... es sind ja tausende Werte.
Also habe ich in datetime umgwandelt...

Code: Alles auswählen

all2 = all.copy()
all2.index = pd.to_datetime(pd.Series(all2.index))
und hier geht etwas schief bei der Umwandlung... Monate und Tage werden vertauscht

Code: Alles auswählen

	Blei 	Zinn 	Kupfer
Datum 			
2004-06-12 	976.15 	8739.40 	3092.0
2004-02-12 	968.11 	8761.46 	3217.0
2004-01-12 	1000.25 	8812.29 	3246.5
2004-11-30 	981.36 	8730.13 	3262.0
2004-10-03 	869.75 	NaN 		2867.0
2004-03-02 	813.50 	NaN 		2547.5
2004-08-01 	752.50 	NaN 		2337.0
2003-11-20 	602.50 	NaN 		1996.0
Nachträgliches Sortieren macht es noch mal deutlicher

Code: Alles auswählen

all2.sort_index(axis=1, inplace = True, ascending=False)
all2.tail(8)
führt zu

Code: Alles auswählen

 	Blei 	Zinn 	Kupfer
Datum 			
2004-08-12 	949.76 	8718.30 	2991.5
2004-08-01 	752.50 	NaN 		2337.0
2004-07-12 	965.26 	8683.11 	3137.0
2004-06-12 	976.15 	8739.40 	3092.0
2004-03-02 	813.50 	NaN 		2547.5
2004-02-12 	968.11 	8761.46 	3217.0
2004-01-12 	1000.25 	8812.29 	3246.5
2003-11-20 	602.50 	NaN 		1996.0
--> Ich habe divsere Parameter ausprobiert, bekomme aber nicht raus, was ich bei der datetime Umwandlung falsch mache.
Please help ;)

VG
NN
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@Natrix natrix: Meiner Meinung nach passt das Thema hier gar nicht. Hier geht es darum, ob Daten im Programm als Strings oder als `datetime`-Objekte gespeichert werden sollen und nicht um das Parsen der Daten.

Hast du dir die Dokumentation von `pd.to_datetime` angeguckt? Wenn ja, was sagt die zu dem Thema, dass zuerst der Tag angegeben ist?

Wenn du die Daten eh parsen willst, dann kannst du auch beim `pd.read_table`-Aufruf `parse_dates=["Datum"]` angeben. Eventuell mit dem passenden Argument, das dafür sorgt, dass die Tage und Monate in der richtigen Reihenfolge geparst werden.
Benutzeravatar
Natrix natrix
User
Beiträge: 16
Registriert: Mittwoch 29. März 2017, 09:16

Danke. Kleine Ursache, große Wirkung.
Habe es bisher z.B. erfolglos mit dem format Paramter versucht.
Jetzt klappt es, Danke!
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@Natrix natrix: Mit `format="%d.%m.%Y"` müsste es eigentlich auch gehen.
Antworten