Tag-Monat-Reihenfolge ändert sich plötzlich

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
Progressive
User
Beiträge: 16
Registriert: Dienstag 25. Juni 2019, 05:43

Hi,

ich habe feststellen müssen, dass sich beim Zeitformat Tag-Monat-Jahr auf einmal die Reihenfolge zu Monat-Tag-Jahr änderte. Innerhalb eines Dataframes bzw. dessen Indizes:

Code: Alles auswählen

30-06-2019 23:58:46
30-06-2019 23:59:46
07-01-2019 00:00:46
07-01-2019 00:01:46
Warum?
Und wie verhindere ich das..?
Das soll natürlich der Erste im Juli sein, nicht der Siebte im Januar..

Screenshot: https://ibb.co/chFbTwD
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Progressive: jetzt wäre es noch schlau zu wissen, wie Du die Daten liest?
Progressive
User
Beiträge: 16
Registriert: Dienstag 25. Juni 2019, 05:43

Ja, habe herumgespielt, die Reihenfolge passt jetzt prinzpiell:

Code: Alles auswählen

30-06-2019 23:57:46
30-06-2019 23:58:46
30-06-2019 23:59:46
01-07-2019 00:00:46
01-07-2019 00:01:46
01-07-2019 00:02:46
Was es letztlich war, kann ich nicht sagen. Ich habe überall, wo es möglich war, "Dayfirst = True" angefügt. Aber wenn ich zwischen

Code: Alles auswählen

02-07-2019 09:00:00
und

Code: Alles auswählen

02-07-2019 13:00:00
slicen möchte, bekomme ich immer noch :

Code: Alles auswählen

KeyError: '02-07-2019 09:00:00'
Die Zeitdaten waren bis dato im Index und bis der Juli hinzukam hat alles funktioniert.. um das Problem etwas einzugrenzen, habe ich die Zeitdaten als zusätzliche Spalte angefügt, damit es nicht irgendwie mit dem Index zusammenhängt. Das ändert aber auch nichts..

Code: Alles auswählen

02-07-2019 08:56:51
02-07-2019 08:57:51
02-07-2019 08:58:51
02-07-2019 08:59:51
02-07-2019 09:00:51
02-07-2019 09:01:51
02-07-2019 09:02:51
02-07-2019 09:03:51
02-07-2019 09:04:51
02-07-2019 09:05:52
02-07-2019 09:06:52
Um zu slicen, benutze ich:

Code: Alles auswählen

df["02-07-2019" :"03-07-2019"] 
.
Ich versteh das Problem nicht..

Kann es sein, dass, unabhängig von der Darstellung bzw. Reihenfolge Tag und Monat trotzdem falsch zugeordnet werden? Also dass python immer noch glaubt, 02 wäre der Monat und 07 der Tag?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Progressive: Du zeigst immer noch keinen Code, was Du eigentlich machst. Sollen wir jetzt raten, warum da irgendwas nicht passt?
Progressive
User
Beiträge: 16
Registriert: Dienstag 25. Juni 2019, 05:43

Hab's irgendwie hingekriegt.. keine Ahnung, wie. Irgendwann hat es funktioniert.

Ich mag meinen Code nicht zeigen, der ist hässlich :mrgreen:
Bin erst vor kurzem zu python (zwangsweise) gewechselt.. ich werde aus der Syntax oft partout nicht schlau. Vor allem das Indizieren ist irgendwie ein unscharfer Mischmasch aus C++/R..

Wie auch immer, ich gelobe Besserung. Das nächste Mal mache ich es verständlicher. Danke trotzdem natürlich!

Für etwaige Leidensgenossen in spe:

bei
pd.to_datetime(df, dayfirst = True)
war schonmal hilfreich, sowie auch
pd.to_datetime(df).dt.strftime("%Y-%d-%m %H-%M-%S")
, also bei letzterem natürlich je nach Format, was man benötigt.
Kurzum: Ich habe python gezwungen, das Format beizubehalten und nicht - warum auch immer - inmitten eines kontinuierlichen Datensatzes auf einmal Monat und Tag zu vertauschen. Sowas Fieses kann man sich nicht ausdenken..
Ahso, und dieses Vertauschen trat definitiv bei
pd.to_datetime
auf.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Progressive: vor `import` steht kein Code, auch kein `print`.
Dass alle Importe in einer Zeile stehen ist schlecht lesbar. Pro importiertem Modul bitte eine eigene Zeile.
Und Module mit _ sind eigentlich nicht dafür gedacht, dass man sie direkt benutzt.
`file_name_input` wird an verschiedenen Stellen benutzt, mal als globale Variable, mal als lokale. Globale Variablen sollte es nicht geben, die lokale macht keinen Sinn, da in der Funktion `read` nichts weiter passiert.
Ein Vergleich auf len(sys.argv)>1 und dann aber auf das dritte Element zuzugreifen, ist wohl ein Programmierfehler. Die zweite Hälfte der Funktion ist wahrscheinlich falsch eingerückt. Nach einem : der einen Bock einleitet wird immer eine neue Zeile angefangen.
Dass Du bei read_csv decimal als "." angibst, später dann "," durch "." ersetzt, ist für mich verwirrend. Was willst Du da tun?
Du hast sehr viele Spalten; warum hast Du die Händisch angegeben? Stehen die nicht in der Datei?
Und statt bestimmte Spalten einzeln aus dem Dataframe zu entfernen, würde ich einfach alle Spalten auswählen, die ich behalten möchte.

Warum wandelst Du die "Zeit"-Spalte nicht schon beim Lesen in datetime um? Was tust Du da mit dem Abschneiden der letzten 4 Zeichen?
Wie sieht Deine Datei aus? Kannst Du da mal ein Beispiel posten?
`df_sensor_copy = df_sensor_values` macht keine Kopie!
Das weitere Herumschieben der Zeit-Spalte macht für mich so auch keinen Sinn. Was willst Du eigentlich erreichen?
Antworten