Frys Python braucht (mal wieder) neue Skills

Ich mach mal nen extra Thread auf, kommt ja doch öfters vor… :usad:

Ich bin so scheiße im Programmieren. Ich will (dachte ich) was ganz einfaches machen. Ich habe ein Dataframe (‚df‘), in der ersten Spalte (‚Datum‘) steht ein Datum im Format ‚yyyymmdd‘.

z.B.
Datum
20120630
20140731
20220131

Nun will ich eine neue Spalte (‚Jahr‘) mit einem Teilstring des Datums belegen. Das versuche ich (erfolglos) wie folgt:

df[‚Monat‘] = str(df[‚Datum‘])[0:4]

Es entsteht auch eine neue Spalte ‚Monat‘, allerdings steht in dieser Spalte immer das Jahr des ersten Datums im Dataframe, also

Monat
2012
2012
2012

Wie bekomme ich das hin, dass in jeder Zeile jeweils das Jahr des Datums in dieser Zeile steht?

Tausend Dank schonmal.

Probiers mal mit:

df[‚Monat‘] = [str(x)[0:4] for x in df[‚Datum‘]]

Also, du nimmst jeden Eintrag einzeln (x … for x in …), holst den Teil raus, den du brauchst ([0:4], und machst daraus eine Liste (äußere eckige Klammern).

Sinnvoll wäre dann vermutlich noch, die Spalte df[‚Jahr‘] zu nennen, oder?

edit: Falls der ursprüngliche Eintrag in df[‚Datum‘] auch schon ein String ist, brauchst du natürlich nicht mal den str(x) - Aufruf.

1 „Gefällt mir“

Äh sorry, die heißt auch so…

Python Skills, ich dachte an was völlig anderes.

Bei @Fry dann eher Anaconda :shushing_face:

Klappt’s denn jetzt?

Neue Probleme, @Fry ?

Ich dachte auch er benötigt neine Python Skills.
Das wäre eher dürftig.

1 „Gefällt mir“

Ungetestet. Aber so sollte das klappen. Evtl. geht es nicht in einer Zeile, dann müsstest du erst zu datetime konvertieren und dann mit dt.month den Monat extrahieren.

df[‚Monat‘] = df.Datum.to_datetime(format=‚%Y%m%d‘).dt.month

Edit: die ‚‘ werden hier leider automatisch ins deutsche konvertiert.

Danke Splashi :usad:

3 „Gefällt mir“

Eben kurz getestet. So funktioniert es.

import pandas as pd

df['Jahr'] = pd.to_datetime(df.Datum, format='%Y%m%d').dt.year
df['Monat'] = pd.to_datetime(df.Datum, format='%Y%m%d').dt.month
df['Tag'] = pd.to_datetime(df.Datum, format='%Y%m%d').dt.day

1 „Gefällt mir“

Danke. Mist dem „to,_datetime“ muss ich Mal schauen. Das kommt aus einem CSV import und wird schon ganz komisch in ein Datum umgewandelt (mit Stunden, Minuten und allem drum und dran). Evtl ist also gar keine Umwandlung in ein Datum nötig und ich kann direkt auf Jahr, Monat etc zugreifen?

Beispiel?

Also…

Das Problem ist anscheinend das Format des Datums nach dem Einlesen. Ich lese das ganze über pd.read_csv ein. Hierbei wird das Datum anscheinend noch nicht in ein Datum umgewandelt. Wenn ich es (wie Dejo) versuche, in ein Datumsobjekt umzuwandeln, kommt die Meldung, dass eine ‚Series‘ kein attribut „to_datetime“ hat. Wie ändert man denn das Format jedes Eintrags eines kompletten Vektors?

Ein String scheint das Datum allerdings auch nicht zu sein, denn ich kann nur mit str(…) auf Teilstrings zugreifen. Das Ergebnis soll dann aber ein String sein.

Ich komme einfach nicht weiter, nicht mit Profiants Lambdafunktion und auch nicht mit Dejos Umweg über ein Datetime-Objekt.

Kann ich denn beim Einlesen der Daten über read_csv gleich mitgeben, welches Format ein Feld haben soll? Ich habe hier irgendwas mit date_parsern gelesen, damit bin ich aber auch nicht wirklich weitergekommen.

Was stellt die Kack DKB auch ihr Onlinebanking um? Manndoo…

Anscheinend versuchst du df.Datum.to_datetime() zu callen (ich hatte das in meinem ersten Post auch so vorgeschlagen). Es muss aber **pd**.to_datetime(df.Datum) sein (siehe zweiter Post). Mit dem Argument format='...' kannst du dann exakt angeben wie df.Datum aussieht, dazu sollte die Spalte Datum vom type string sein. Ansonsten ist es ggf. als int eingelesen, was man recht simpel zu einem str umwandeln kann.

Ja. Ist das Argument dtype= Pandas: How to Specify dtypes when Importing CSV File - Statology

1 „Gefällt mir“

Ah, geil, danke. Jetzt habe ich es fast. Ich muss jetzt nur noch verhindern, dass beim Umwandeln des Monats in einen String die führende Null wegfällt…

Genauer gesagt soll in „Monat“ nämlich sowas stehen:

kosten['Monat'] = [str(x.year) + str(x.month) for x in kosten['Buchungstag']]

Leider wird das aktuell noch zu 20239 statt 202309.

Hi, vielleicht kann mir jemand behilflich sein,
Ich will aus einer txt datei eine csv machen, damit ich daraus später ein dgm erstellen kann.
Ich habe eine txt Datei in der befinden sich x Koordinaten, y Koordinaten, und z Koordinieren. Wenn ich jetzt die txt in Excel öffne, ändert er nach dem speichern die z Koordinaten in ein Datum um. Wo liegt denn hier der Fehler?

Es handelt sich hierbei um Vermessungspunkte, das müssen mehrere 1000 Punkte sein, keine Ahnung.
jetzt möchte ich die durchnummeriert, also Spalte vorne erstellen, 1 und 2 eingeben beide markieren, und bis unten ziehen wäre eigentlich der Schritt, aber da es sich um so viele Punkte handelt, geht das nicht, gibt es einen einfachen Weg wie ich die erste und die letzte Zeile markiere, und der Rest automatisch durchnummeriert wird?