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
Spalte aus Dataframe von tring in datetime ändern
- __blackjack__
- User
- Beiträge: 14045
- 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. 
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
schau mal hier rein https://pandas.pydata.org/pandas-docs/s ... stamp.html
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
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
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.
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.
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.
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.
- __blackjack__
- User
- Beiträge: 14045
- 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`:
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.
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]')
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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
@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.
@__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.
- __blackjack__
- User
- Beiträge: 14045
- 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.
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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.