2016-09-27 3 views
3

Versuchen, Pandas Spalten df['day'] in Datetime-Typ zu analysieren. Werte werden aktuell als Strings geschrieben, wie zum Beispiel: 2016-9-1. Dies entspricht Jahr-Monat-Tag.Parse Pandas Spalte bis Datum von String mit Bindestrichen

Ich verfolge die Formatierung auf dieser Seite: http://strftime.org/

Ich versuchte zunächst

pd.to_datetime(df['day'], format="%Y-%m-%d") 

zu verwenden, bekam aber den Fehler

ValueError: time data 'day' does match format specified 

dachte ich, das Problem an diesem Tag war und Monat waren nicht Null, gepolstert, so änderte es zu:

pd.to_datetime(df['day'], format="%Y-%-m-%-d") 

Ich verwende %-m und %-d, da beide nicht-gepolstert (dezimal) Zahlen entsprechen.

verschiedene Fehler bekommen:

ValueError: '-' is a bad directive in format '%Y-%-m-%-d' 

Sollte ich nicht aus http://strftime.org/ nach der Formatierung Konvention werden, bin ich etwas fehlt?

Antwort

3

Sie müssen - in format Parameter entfernen:

df = pd.DataFrame({'day':['2016-9-1']}) 
print (df) 
     day 
0 2016-9-1 

print (pd.to_datetime(df['day'], format="%Y-%m-%d")) 
0 2016-09-01 
Name: day, dtype: datetime64[ns] 

EDIT:

So ist es, wie einige schlechte Daten aussieht, so dass Sie verwenden können:

df = pd.DataFrame({'day':['2016-9-1', '2016-12-0']}) 
print (df) 
     day 
0 2016-9-1 
1 2016-12-0 

#check problematic values 
print (df[pd.to_datetime(df['day'], format="%Y-%m-%d", errors='coerce').isnull()]) 
     day 
1 2016-12-0 

#convert problematic values to NaT 
print (pd.to_datetime(df['day'], format="%Y-%m-%d", errors='coerce')) 
0 2016-09-01 
1   NaT 
Name: day, dtype: datetime64[ns] 
+0

es seltsam, wenn ich laufe Deinen Code selbst, bekomme ich denselben Output wie Du. Wenn ich jedoch den gesamten Datenframe laufe, bekomme ich "ValueError: time data" day "entspricht dem angegebenen Format" – Brian

+0

Rargh. Ihre Einschätzung war genau richtig, es waren schlechte Daten. Ich kann nicht glauben, wie viel Zeit ich verschwendete, um das nicht zu überprüfen. – Brian