2016-09-24 5 views
1

Nach einem Datenrahmen mit Panda (aus einer CSV) mit dieser Struktur laden:Gebäude Datumzeit von 3 integer/float-Spalt in Pandas

  startmonth startday startyear endmonth endday endyear 
caseid                 
1945121601  12.0  16.0  1945  5.0 27.0 1947.0 
1946031101   3.0  11.0  1946  10.0  9.0 1993.0 
1946110101  11.0  1.0  1946  2.0  4.0 1947.0 

Ich denke, wie effizient die ersten 3 & letzten 3 Spalten verwenden, um Generiere 2 datetime columns und sage 'startdate' und 'enddate'. Da es keine Werte gibt, die behandelt werden müssen, scheinen die Argumente parse_dates & date_parser in read_csv ein wenig unhandlich zu sein, also schrieb ich die folgende Funktion.

Zuerst fülle ich den NaN-Wert, um Monat und Datum von Float zu Integer zu übertragen, und zeichne sie dann zum Parsen zusammen.

Die resultierende Fehlermeldung ist ein wenig verwirrend, da das Zeichenkettenformat genau das selbe sein sollte, was mit strptime erwartet wird.

n [338]: dateparser() 
Traceback (most recent call last): 

    File "<ipython-input-338-917257f547ca>", line 1, in <module> 
    dateparser() 

    File "<ipython-input-337-41aa89124ae6>", line 5, in dateparser 
    return pd.datetime.strptime(x, '%Y %m %d') 

    File "/Users/Username/anaconda/lib/python3.5/_strptime.py", line 510, in _strptime_datetime 
    tt, fraction = _strptime(data_string, format) 

    File "/Users/Username/anaconda/lib/python3.5/_strptime.py", line 343, in _strptime 
    (data_string, format)) 

    ValueError: time data 'caseid\n1945121601 1945\n1946031101  
1946\n1946110101 1946\n1947022401 1947\n1947053101 
     1947\n1947111001 1947\n1947120501 1947\n1947120502  
1947\n1947120503 1947\n1947120504 1947\n1947120505  
1947\n1947120506 1947\n1947120507 1947\n1947122001  
1947\n1948032501 1948\n1948032502 1948\n1948070101  
6\n2005100601 10\n 

    Name: startmonth, dtype: int64 caseid\n1945121601 16\n1946031101  
6\nName: startday, dtype: int64' does not match format '%Y %m %d'` 

Ich habe versucht, auch eine andere Analyse-Paket, das ohne Frage der größte Teil des Datetime-Zeichenfolge in englischer Sprache in Datetime-Variable schaltet sich:

from dateutil.parser import parse 
def dateparser(): 
    (same function as above) 
    return parse(x) 

Und es ergibt sich auch Fehler (Valueerror: Unknown String-Format). ..

Irgendwelche Gedanken, wie man die Funktion verbessert, werden sehr geschätzt. Es ist auch ein bisschen komisch für mich, dass die meisten Paketfunktionen string nur in datetime umwandeln, und man muss ganze Zahlen/floats in string machen, auch wenn es nicht so schwer sein sollte, numerische Daten in Datetime-Formate umzuwandeln ... habe ich verpassen Sie einige offensichtliche Lösungen?

+1

Setzen Sie ein '' 'try/except''' Block um die Codezeile und fangen die' '' ValueError''', in der '' 'except''' Suite Drucken Sie die Funktionsargumente und Ihre Datumsstring - '' 'x'''. Das sollte dir eine Vorstellung davon geben, was passiert. Erheben Sie den Fehler in der '' 'except'''Suite, wenn Sie wollen, dass es an diesem Punkt aufhört. Http://docs.python.org/3/tutorial/errors.html#handling-exceptions – wwii

+0

vielen Dank für der Hinweis, wie das zu debuggen ist! Ich habe das Problem erfolgreich gefunden und werde es unten als Referenz beantworten. –

Antwort

0

Obwohl nicht absolut sicher, das Problem scheint zu sein, dass ich versuche, den Parser eine Pandas-Serie zu füttern, während sie erwarten, nur String zu nehmen.

In diesem Fall kann Pandas eigene to_datetime Funktion die Arbeit erledigen.

def dateparser(y=t4.startyear,m=t4.startmonth,d=t4.startday): 
    y = y.astype(str)  
    m = m.fillna(1).astype(int).astype(str) 
    d = d.fillna(1).astype(int).astype(str) 
    x = y +' '+ m +' '+ d 
    return pd.to_datetime(x) 
Verwandte Themen