2016-04-23 8 views
3

Ich lese eine .csv in einen Pandas Datenrahmen (CorpActionsDf). dessen Kopf ist:Pandas Dataframe: TypeError: unkorrigierbare Typen: str()> = datetime.date()

     date factor_value reference    factor 
unique_id                
BBG.XAMS.ASML.S 24/04/2015   0.70 Annual  Regular Cash 
BBG.XAMS.ASML.S 25/04/2014   0.61 Annual  Regular Cash 
BBG.XAMS.ASML.S 26/04/2013   0.53 Annual  Regular Cash 
BBG.XAMS.ASML.S 26/11/2012   9.18  None Return of Capital 
BBG.XAMS.ASML.S 27/04/2012   0.46 Annual  Regular Cash 

ich dann versuche, die Datenrahmen zu filtern, so dass ich nur die Daten zwischen zwei Daten im Auge behalten.

startDate=02-01-2008 
endDate=20-02-2008 

Aber ich erhalte den folgenden Fehler:

TypeError: <class 'datetime.date'> type object 2008-01-02 

Ich habe einen anderen Prozess, der die startdate und endDate verwendet, um Informationen mit Erfolg zu filtern, aber aus irgendeinem Grund dieses Mal kann ich die Filterung nicht erhalten Arbeit. Mein Code ist wie folgt:

def getCorpActionsData(rawStaticDataPath,startDate,endDate): 
    pattern = 'CorporateActions'+ '.csv' 
    staticPath = rawStaticDataPath 

    with open(staticPath+pattern,'rt') as f: 

     CorpActionsDf = pd.read_csv(f,engine='c',header=None,usecols=[0,1,2,3,4],parse_dates=[1], 
            dayfirst=True,index_col=[1],names=['unique_id', 'date','factor_value','reference','factor'])  
     print(CorpActionsDf.head()) 

     CorpActionsDf = CorpActionsDf[(CorpActionsDf.index >= startDate) & (CorpActionsDf.index <= endDate)] 

I gesetzt parse_dates gleich Spalte 1, so bin ich nicht sicher, was ich falsch gemacht habe. Wenn jemand eine Anleitung anbieten könnte, würde es geschätzt werden.

Vielen Dank

+1

pd.read_csv können nimm eine Datei oder ein Dateiähnliches Objekt. Warum öffnest du die Datei selbst? – hd1

Antwort

1

UPDATE:

i Ihr Index erraten ist der String (Objekt) geben - wegen, dass die folgende Bedingung (CorpActionsDf.index >= startDate) gibt Ihnen str() >= datetime.date() Fehlermeldung.

Was gibt CorpActionsDf.index.dtype als Ausgabe?

ALTE Antwort:

stellen Sie sicher, dass Ihre startDate und endDate richtigen Datentyp haben:

startDate=pd.to_datetime('02-01-2008') 
endDate=pd.to_datetime('20-02-2008') 
+0

yep, setze das Start- und Enddatum auf pd.to_datetime, leider bekomme ich den gleichen Fehler – Stacey

+0

@Stacey, was ist die Ausgabe von 'CorpActionsDf.index.dtype'? – MaxU

0

Sie können zunächst stringsto_datetime und dann Indizierung versuchen konvertieren verwenden, indem Sie diese Werte:

import pandas as pd 
import io 

temp=u""" 
BBG.XAMS.ASML.S,24/04/2015,0.70,Annual,Regular Cash 
BBG.XAMS.ASML.S,25/04/2014,0.61,Annual,Regular Cash 
BBG.XAMS.ASML.S,26/04/2013,0.53,Annual,Regular Cash 
BBG.XAMS.ASML.S,26/11/2012,9.18,None,Return of Capital 
BBG.XAMS.ASML.S,27/04/2012,0.46,Annual,Regular Cash 
""" 
#after testing replace io.StringIO(temp) to filename 
CorpActionsDf = pd.read_csv(io.StringIO(temp), 
       header=None, 
       usecols=[0,1,2,3,4], 
       parse_dates=[1], 
       dayfirst=True, 
       index_col=[1], 
       names=['unique_id', 'date','factor_value','reference','factor']) 
print CorpActionsDf 
        unique_id factor_value reference    factor 
date                 
2015-04-24 BBG.XAMS.ASML.S   0.70 Annual  Regular Cash 
2014-04-25 BBG.XAMS.ASML.S   0.61 Annual  Regular Cash 
2013-04-26 BBG.XAMS.ASML.S   0.53 Annual  Regular Cash 
2012-11-26 BBG.XAMS.ASML.S   9.18  None Return of Capital 
2012-04-27 BBG.XAMS.ASML.S   0.46 Annual  Regular Cash  
startDate=pd.to_datetime('2014-04-25') 
endDate=pd.to_datetime('2012-11-26') 

print CorpActionsDf[startDate:endDate] 
        unique_id factor_value reference    factor 
date                 
2014-04-25 BBG.XAMS.ASML.S   0.61 Annual  Regular Cash 
2013-04-26 BBG.XAMS.ASML.S   0.53 Annual  Regular Cash 
2012-11-26 BBG.XAMS.ASML.S   9.18  None Return of Capital 

Interessant, wenn Sieverwendenwird letzte Zeile omited:

print CorpActionsDf['2014-04-25':'2012-11-26'] 
        unique_id factor_value reference  factor 
date                
2014-04-25 BBG.XAMS.ASML.S   0.61 Annual Regular Cash 
2013-04-26 BBG.XAMS.ASML.S   0.53 Annual Regular Cash 

EDIT:

Sie für die richtige Auswahl zu sort_index haben:

print CorpActionsDf 
        unique_id factor_value reference    factor 
date                 
2015-04-24 BBG.XAMS.ASML.S   0.70 Annual  Regular Cash 
2014-04-25 BBG.XAMS.ASML.S   0.61 Annual  Regular Cash 
2013-04-26 BBG.XAMS.ASML.S   0.53 Annual  Regular Cash 
2012-11-26 BBG.XAMS.ASML.S   9.18  None Return of Capital 
2012-04-27 BBG.XAMS.ASML.S   0.46 Annual  Regular Cash 

CorpActionsDf = CorpActionsDf.sort_index() 
print CorpActionsDf 

date                 
2012-04-27 BBG.XAMS.ASML.S   0.46 Annual  Regular Cash 
2012-11-26 BBG.XAMS.ASML.S   9.18  None Return of Capital 
2013-04-26 BBG.XAMS.ASML.S   0.53 Annual  Regular Cash 
2014-04-25 BBG.XAMS.ASML.S   0.61 Annual  Regular Cash 
2015-04-24 BBG.XAMS.ASML.S   0.70 Annual  Regular Cash 

print CorpActionsDf['2012-11-2':'2014-04-25'] 
        unique_id factor_value reference    factor 
date                 
2012-11-26 BBG.XAMS.ASML.S   9.18  None Return of Capital 
2013-04-26 BBG.XAMS.ASML.S   0.53 Annual  Regular Cash 
2014-04-25 BBG.XAMS.ASML.S   0.61 Annual  Regular Cash 

Eine andere Lösung mit truncate:

print CorpActionsDf.truncate(before='2012-11-2', after='2014-04-25') 
        unique_id factor_value reference    factor 
date                 
2012-11-26 BBG.XAMS.ASML.S   9.18  None Return of Capital 
2013-04-26 BBG.XAMS.ASML.S   0.53 Annual  Regular Cash 
2014-04-25 BBG.XAMS.ASML.S   0.61 Annual  Regular Cash 
+0

danke, ich habe versucht CorpActionsDf = pd.read_csv (f, header = None, usecols = [0,1,2,3,4], parse_dates = [1], dayfirst = True, index_col = [1], names = [ 'unique_id' , 'Datum', 'Faktor_Wert', 'Referenz', 'Faktor')), aber der folgende Fehler: 'KeyError:' Linke Schicht nicht für nicht eindeutige Label erhalten: datetime.date (2008, 1, 2) ' ', irgendeine Idee, was ich tun soll? – Stacey

+0

Es bedeutet, dass im Index kein 'datetime.date (2008, 1, 2)' steht. Also müssen Sie verwenden: 'CorpActionsDf = CorpActionsDf [(CorpActionsDf.index> = Startdatum) & (CorpActionsDf.index <= EndDate)]' – jezrael

+0

Hi jezrael, versuchte die Änderung an den Code jetzt erhalten einen Fehler 'TypeError: type Objekt 2008-01-02' – Stacey