Spalte aus Dataframe von tring in datetime ändern

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
Ulia
User
Beiträge: 5
Registriert: Dienstag 23. Juli 2019, 14:28

Hallo zusammen,

kleine Vorwarnung, ich bin Python Neuling. Aber zu meinem Problem: Ich versuche aktuell einen Datensatz (namens Erzeugung) für ein neuronales Netz mit Zeitbezug aufzubereiten.

Hierfür habe ich eine csv mit mehreren Spalten. In einer dieser Spalten steht eine Uhrzeiten in 15-min-Sprüngen (00:00, 00:15, 00:30, ... 23:45, 00:00, 00:15, ... usw.) dies geht für das gesamte Jahr 2018.
Wenn ich den Datentyp überprüfe (mittels Erzeugung.types) steht als Datentyp object bei dieser Spalte. Nun will ich diesen in einen datetime Objekttyp verändern.

Folgender Befehl hat das zwar geschafft, aber auch das ungewollte aktuelle Datum davorgehängt:
Erzeugung["uhrzeit"] = Erzeugung["uhrzeit"].astype("datetime64[ns]")
--> 2019-07-22 00:00:00, 2019-07-22 00:15:00, ...

Wäre es möglich mir nur die Uhrzeiten ausgeben zu lassen?
Oder zumindest das richtige Datum? (Datensatz beginnt am 01.01.2018 00:00 bis zum 31.12.2018 23:45)

Ich hatte es auch bereits mit strftime versucht, das hat den Datentyp allerdings nicht verändert
Erzeugung["uhrzeit"] = pd.to_datetime(Erzeugung["uhrzeit"].values).strftime('%H:%M')

Diese Variante als for-Schleife hat auch nicht funktioniert und damit sind mir die Ideen ausgegegangen...
zeit = []
for i in range(0, len(Erzeugung)):
zeit.append(pd.to_datetime(Erzeugung["uhrzeit"].values).strftime("%H:%M"))
Erzeugung["uhrzeit"] = zeit
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ulia: So ganz grob könnte man da ein Timedelta draus machen, dann gruppieren an den Stellen wo die Zeit von einem auf den nächsten Wert kleiner wird, also wo ein neuer Tag anfängt, diese Gruppen nummerieren. Die Gruppennummer als Timedelta (Einheit „Tag“) auf die Timedeltas aus den Zeiten addieren, und am Ende dann das Startdatum auf alles addieren. Aber vielleicht gibt's auch etwas einfachereres. 🙂
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Ulia
User
Beiträge: 5
Registriert: Dienstag 23. Juli 2019, 14:28

Danke für die Hilfestellungen!
Ich weiß nicht ob es schneller oder einfacher geht, aber ich habe es jetzt hinbekommen.

Zuerst habe ich eine Liste mit einer Zeitspanne von 01.01.2018 00:00 bis 31.12.2018 23.45 erstellt mittels

from datetime import datetime, timedelta
Import Pandas as pd

l = (pd.DataFrame(columns=['NULL'],
index=pd.date_range('2018-01-01 00:00:00', '2018-12-31 23:45:00',
freq='15T'))
.index.strftime('%Y-%m-%d %H:%M:%S')
.tolist()
)

und die Werte aus der Spalte Erzeugung["uhrzeit"] mit diesen ersetzt.
Dann war der Typ zwar immer noch ein "object", aber auf diese Spalte hat dann
Erzeugung["uhrzeit"] = Erzeugung["uhrzeit"].astype("datetime64[ns]")
funktioniert.

In der Spalte steht jetzt das gewünschte Datum mit Uhrzeit und wird als datetime Objekt angezeigt.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hey,

beim posten von Code bitte den Code-Tag nutzen. Dafür einfach in den vollständigen Editor (Vollständiger Editor & Vorschau Button drücken) gehen und den Button </> anklicken. Dazwischen dann den Code posten, damit wichtige Sachen wie die Einrückung nicht verloren gehen.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ulia: Es geht bestimmt einfacher als die Zeitstempel erst in Zeichenketten umzuwandeln, und die Zeichenketten dann wieder in Zeitstempel umzuwandeln. Den `DataFrame` und die Liste braucht man auch nicht. Nimm von dem Index einfach die `values`:

Code: Alles auswählen

In [21]: pd.date_range('2018-01-01 00:00:00', '2018-12-31 23:45:00', freq='15T')
Out[21]: 
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 00:15:00',
               '2018-01-01 00:30:00', '2018-01-01 00:45:00',
               '2018-01-01 01:00:00', '2018-01-01 01:15:00',
               '2018-01-01 01:30:00', '2018-01-01 01:45:00',
               '2018-01-01 02:00:00', '2018-01-01 02:15:00',
               ...
               '2018-12-31 21:30:00', '2018-12-31 21:45:00',
               '2018-12-31 22:00:00', '2018-12-31 22:15:00',
               '2018-12-31 22:30:00', '2018-12-31 22:45:00',
               '2018-12-31 23:00:00', '2018-12-31 23:15:00',
               '2018-12-31 23:30:00', '2018-12-31 23:45:00'],
              dtype='datetime64[ns]', length=35040, freq='15T')

In [22]: pd.date_range('2018-01-01 00:00:00', '2018-12-31 23:45:00', freq='15T').values
Out[22]: 
array(['2018-01-01T00:00:00.000000000', '2018-01-01T00:15:00.000000000',
       '2018-01-01T00:30:00.000000000', ...,
       '2018-12-31T23:15:00.000000000', '2018-12-31T23:30:00.000000000',
       '2018-12-31T23:45:00.000000000'], dtype='datetime64[ns]')
Und Du solltest prüfen ob das Ergebnis stimmt, denn wenn Du ein ganzes Jahr hast, dann sind da ja zweimal Umstellungen Sommer-/Winterzeit drin. Wenn die Werte da nicht stimmen, brauchst Du noch die Zeitzone in den Daten. Und das alles funktioniert natürlich auch nur wenn die Daten keine Lücken haben. Was ja mit ein Grund ist, warum man Zeitstempel aufzeichnet – um so etwas berücksichtigen zu können.

Falls Du Einfluss auf die Quelle der Daten hast, wäre das eine gute Gelegenheit das mal zu fixen. Also vollständige Zeitstempel speichern und entweder mit Zeitzone oder UTC-Zeit speichern.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Ulia
User
Beiträge: 5
Registriert: Dienstag 23. Juli 2019, 14:28

@Jankie alles klar ich versuche das beim nächsten Post mit Code, Danke für den Tipp!

@__blackjack__: Ja du hast vermutlich recht, deine Lösung scheint mir auch eleganter. Bin noch eine Beginner und deshalb einfach froh wenn der Code letztendlich mal das macht was ich will ^^

Die Zeitumstellung berücksichtige ich in meinem aktuellen Prototyp für meine Masterarbeit erstmal nicht. In meinen Daten betrachte ich Messwerte von Stromerzeugung. Bedeutet wenn eine Stunde vorgestellt wird ist der Wert 0 und beim zurückstellen sind die Werte höher da doppelt erzeugt wird. Natürlich kann man da Anmerken dass das nicht sehr schlau ist, aber aufgrund einer gewissen Zeitknappheit will ich erstmal ein passendes Modell für mein neuronales Netz finden, und dazu brauche ich einen brauchbaren Datensatz zum rumprobieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ulia: Bei Masterarbeit nicht unwichtig: Auch wenn Du es im Code nicht berücksichtigst, am Ende in der Arbeit trotzdem erwähnen das es dieses Problem gibt, welche Auswirkungen das wahrscheinlich hat und in welcher Grössenordnung und wie man damit umgehen könnte.

Wobei, wenn Du die Zeiten wie jetzt hier nachträglich in regelmässiger Frequenz generierst, dann stimmen die nach der ersten Zeitumstellung grundsätzlich für die ganzen folgenden Tage ja nicht. Man muss bei Auswertungen also vorsichtig sein mit so Aussagen wie „um x Uhr herum“ sieht man an allen Tagen…” weil x Uhr an vielen Tagen dann tatsächlich eine Stunde daneben liegt. Muss man also auf jeden Fall im Hinterkopf behalten. Wenn diese Verschiebung kein Problem darstellt muss/sollte man in der Ausarbeitung begründen *warum* das kein Problem ist. Die Antwort auf solche Fragen möchte man nicht ad hoc in der Verteidigung der Arbeit überlegen müssen, wenn da dann jemand die Frage stellt. 😎
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten