Ich habe eine pandas
Datenrahmen mit mehreren Spalten von Zeichenfolgen für Daten, mit leeren Zeichenfolgen für fehlende Daten. Zum BeispielPandas konvertieren Zeichenfolge Spalten zu Datetime, so dass fehlende, aber nicht ungültig
import numpy as np
import pandas as pd
# expected date format is 'm/%d/%Y'
custId = np.array(list(range(1,6)))
eventDate = np.array(["06/10/1992","08/24/2012","04/24/2015","","10/14/2009"])
registerDate = np.array(["06/08/2002","08/20/2012","04/20/2015","","10/10/2009"])
# both date columns of dfGood should convert to datetime without error
dfGood = pd.DataFrame({'custId':custId, 'eventDate':eventDate, 'registerDate':registerDate})
Ich versuche zu:
- Effizientes Spalten konvertieren, in der alle Strings gültige Daten oder leer in Spalten vom Typ
datetime64
(mitNaT
für die leeren) sind ValueError
anheben, wenn alle Nicht leere Zeichenfolge stimmt nicht mit dem erwarteten Format überein,
Beispiel wo ValueError
angehoben werden soll:
# 2nd string invalid
registerDate = np.array(["06/08/2002","20/08/2012","04/20/2015","","10/10/2009"])
# eventDate column should convert, registerDate column should raise ValueError
dfBad = pd.DataFrame({'custId':custId, 'eventDate':eventDate, 'registerDate':registerDate})
Diese Funktion tut, was ich auf Elementebene will:
from datetime import datetime
def parseStrToDt(s, format = '%m/%d/%Y'):
"""Parse a string to datetime with the supplied format."""
return pd.NaT if s=='' else datetime.strptime(s, format)
print(parseStrToDt("")) # correctly returns NaT
print(parseStrToDt("12/31/2011")) # correctly returns 2011-12-31 00:00:00
print(parseStrToDt("12/31/11")) # correctly raises ValueError
Ich habe jedoch read, dass String-Operationen nicht np.vectorize
-d sein sollten. Ich dachte, dies effizient pandas.DataFrame.apply
mit getan werden könnte, wie in:
dfGood[['eventDate','registerDate']].applymap(lambda s: parseStrToDt(s)) # raises TypeError
dfGood.loc[:,'eventDate'].apply(lambda s: parseStrToDt(s)) # raises same TypeError
Ich vermute, dass die TypeError
hat etwas mit meiner Funktion, die ein unterschiedliches dtype
zu tun, aber ich mag die Vorteile von dynamischer Typisierung nehmen und Ersetzen Sie die Zeichenfolge durch eine Datetime (es sei denn, ValueError wird erhöht) ... wie kann ich das tun?
Sie können 'pd.to_datetime' einfach mit param' errors = 'coerce'' verwenden, also 'pd.to_datetime (x, errors =' coerce ')' wo 'x' ist Ihre df-Spalte – EdChum
@EdChum thanks but' pd.to_datetime (dfBad ['registerDate'], errors = 'coerce') 'hebt' ValueError' nicht hervor, und ich suche nach 'ValueError' für ungültige Datumszeichenfolgen. Die Einstellung 'errors = 'coerce'' verhindert dies. – C8H10N4O2
Aber der Punkt hier ist, dass Sie 'np.NaT' (Not A Time) für ungültige oder leere Zeichenfolgen erhalten und Sie können diese mit' dropna' ausfiltern. – EdChum