2016-07-06 7 views
1

Ich lese eine Excel-Datei und möchte eine Datetime-Spalte zum 1. eines jeden Monats löschen. Die Entbehrung funktioniert gut, aber Pandas versuchen, die Strings in Floats umzuwandeln, und es wird ein Fehler ausgegeben, wenn sie als Coulmn eines vorhandenen Datenrahmens hinzugefügt werden.Wie man Pandas davon abhält, Strings in Floats zu konvertieren?

Wie kann ich dies deaktivieren, und nur eine Spalte mit Art der Zeichenfolge oder Datum?

Ich habe versucht, variiert Mapping/Typ Casting ohne Wirkung (gleicher Fehler). Wenn ich zu einem Proxy-Int konvertiere, verschwindet das Typ-Casting-Problem (da es es in float konvertieren kann), aber es ist eine hässliche Problemumgehung, anstatt das wirkliche Problem zu lösen.

Code-Snippet veranschaulicht das Problem

df = pd.read_excel(file_name, skiprows=[1], skip_footer=1) 

print(df['Purch.Date'].dtype) 
>>> datetime64[ns] 

print(df['Purch.Date'].head()) 
>>> 0 2016-06-23 
>>> 1 2016-06-09 
>>> 2 2016-06-24 
>>> 3 2016-06-24 
>>> 4 2016-06-24 


df['YearMonthCapture'] = df['Purch.Date'].map(lambda x: str(x.replace(day=1).date())).astype(str) 

>>> ValueError: could not convert string to float: '2016-06-01' 

# === Other approached resulting in same error === 
#df['YearMonthCapture'] = df['Purch.Date'].map(lambda x: x.replace(day=1)) 
#df['YearMonthCapture'] = pd.Series(df['Purch.Date'].map(lambda x: str(x.replace(day=1).date())), dtype='str') 
#df['YearMonthCapture'] = pd.Series(df['Purch.Date'].apply(lambda x: str(x.replace(day=1).date())), dtype='str') 

# === Ugly work around that does not really address the problem) === 
df['YearMonthCapture'] = pd.Series(df['Purch.Date'].apply(lambda x: 100*x.year + x.month) 

Antwort

0

Sie dies durch den Zugriff auf das day Attribut tun kann, und ein TimedeltaIndex von Ihrer Datumzeit subtrahiert und zu str Gießen:

In [138]: 
df = pd.DataFrame({'date':pd.date_range(dt.datetime(2016,1,1), periods=4)}) 
df 

Out[138]: 
     date 
0 2016-01-01 
1 2016-01-02 
2 2016-01-03 
3 2016-01-04 

In [142]: 
(df['date'] - pd.TimedeltaIndex(df['date'].dt.day - 1, unit='D')).astype(str) 

Out[142]: 
0 2016-01-01 
1 2016-01-01 
2 2016-01-01 
3 2016-01-01 
Name: date, dtype: object 

So in Ihrem Fall:

df['YearMonthCapture'] = (df['Purch.Date'] - pd.TimedeltaIndex(df['Purch.Date'].dt.day - 1, unit='D')).astype(str) 

sollte funktionieren

+0

Danke, funktionierte schön – EmilMachine

Verwandte Themen