Daten einlesen csv

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
Hope
User
Beiträge: 11
Registriert: Montag 16. November 2020, 19:38

Hallo,
ich habe eine csv-Datei in Python eingelesen, und versuche die Daten zu säubern.

Das ist die folgende Funktion:
# Datum war manchmal komisch formatiert, diese Funktion korrigiert das
def fix_gaps(str):

m = re.search(r'[12]\d{5}:', str)
n = re.search(r'[12]\d{4}:', str)

if m is not None:
loc = m.span()[0] + 4
return str[:loc] + " " + str[loc:]
elif n is not None:
loc = n.span()[0] + 4
return str[:loc] + " " + str[loc:]
else: return str
Dieser Code funktioniert leider nicht, und ich weiss nicht, wo mein Fehler ist.
# Datetime säubern
df['article_datetime'] = df['article_datetime'].apply(lambda x: x.replace('‎', "").replace('Published',''))
df['article_datetime'] = df['article_datetime'].apply(lambda x: parse(fix_gaps(x)).date())
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-66-dbd28c776b3b> in <module>
1 # Datetime säubern
----> 2 df['article_datetime'] = df['article_datetime'].apply(lambda x: x.replace('‎', "").replace('Published',''))
3 df['article_datetime'] = df['article_datetime'].apply(lambda x: parse(fix_gaps(x)).date())

/Applications/anaconda3/lib/python3.8/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
3846 else:
3847 values = self.astype(object).values
-> 3848 mapped = lib.map_infer(values, f, convert=convert_dtype)
3849
3850 if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-66-dbd28c776b3b> in <lambda>(x)
1 # Datetime säubern
----> 2 df['article_datetime'] = df['article_datetime'].apply(lambda x: x.replace('‎', "").replace('Published',''))
3 df['article_datetime'] = df['article_datetime'].apply(lambda x: parse(fix_gaps(x)).date())

AttributeError: 'float' object has no attribute 'replace'
Kann mir jemand bitte behilflich sein???

Vielen Dank
Hope
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Fehlermeldung ist doch deutlich: Die Spalte article_datetime enthält offensichtlich Zahlen, und da funktioniert replace nicht.

Das fix_gaps geht kürzer über

Code: Alles auswählen

re.sub(r'([12]\d{3})(\d{1,2}:)', lambda m:' '.join(m.groups()), string)
Da spart man sich das Stringgefummel.
Hope
User
Beiträge: 11
Registriert: Montag 16. November 2020, 19:38

Danke für die Antwort.

Ich habe es so korrigiert. Ist es richtig?
Er gibt mir wieder eine Fehlermeldung
# Datetime säubern
#df['article_datetime'] = df['article_datetime'].apply(lambda x: x.replace('‎', "").replace('Published',''))
df['article_datetime'] = df['article_datetime'].apply(lambda x: parse(fix_gaps(x)).date())
df['article_datetime'] = df['article_datetime'].re.sub(r'([12]\d{3})(\d{1,2}:)', lambda m:' '.join(m.groups()), string)
TypeError: expected string or bytes-like object
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hope: Das kann nicht in der letzten Zeile sein, denn da würde es einen `AttributeError` geben weil `Series`-Objekte kein `re`-Attribut haben. Hätten sie es, wäre das nächste Problem was denn `string` sein soll?

Ich würde da auch nicht so viel mit `apply()` machen, denn es gibt bessere Wege der Zeichenkettenverarbeitung auf `Series`-Objekten unter dem `str`-Attribut. Das `replace()` dort kann beispielsweise schon reguläre Ausdrücke.

Etwas in der Richtung:

Code: Alles auswählen

    # Datetime säubern
    df["article_datetime"] = pd.to_datetime(
        df["article_datetime"]
        .str.replace(r"‎|Published", "")
        .str.replace(r"([12]\d{3})(\d{1,2}:)", lambda m: " ".join(m.groups()))
    )
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten