Seite 1 von 1

Daten einlesen csv

Verfasst: Freitag 12. März 2021, 14:12
von Hope
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

Re: Daten einlesen csv

Verfasst: Freitag 12. März 2021, 15:49
von Sirius3
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.

Re: Daten einlesen csv

Verfasst: Freitag 12. März 2021, 16:26
von Hope
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

Re: Daten einlesen csv

Verfasst: Freitag 12. März 2021, 18:54
von __blackjack__
@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()))
    )