2014-12-16 6 views
13

Entschuldigung im Voraus dafür, aber nach zwei Stunden suchen und versuchen kann ich hier nicht die richtige Antwort bekommen. Ich habe einen Datenrahmen, über pandas io sql.read_frame() bevölkert. Die Spalte, die sich als zu viel für mich erweist, ist dtypeint64. Die Ganzzahlen haben das Format YYYYMMDD. zum Beispiel 20070530 - 30. Mai 2007. Ich habe eine Reihe von Ansätzen ausprobiert, die offensichtlichste ist;Python pandas integer JJJJMMTT bis datetime

pd.to_datetime(dt['Date']) und pd.to_datetime(str(dt['Date']))

mit mehreren Variationen der Funktionen verschiedene Parameter.

Das Ergebnis war im besten Fall, dass das Datum als Uhrzeit interpretiert wurde. Das Datum ist auf 1970-01-01 - Ergebnis nach oben Beispiel 1970-01-01 00:00:00.020070530

ich verschiedene .map() Funktionen auch in simular Einträge gefunden versucht.

Ich habe festgestellt, dass nach np.date_range() Zeichenfolge Werte des Formats YYYYMMDD interpretieren kann, aber das ist die nächste, die ich zu einer Lösung gekommen bin.

Wenn jemand eine Antwort hat, wäre ich sehr dankbar!

EDIT: Angesichts der Antwort von Ed Chum, ist das Problem wahrscheinlich auf Codierung zurückzuführen. rep() auf einer Teilmenge der Datenrahmen ergibt:

OrdNo LstInvDt \ N0
9 20.070.620 \ n1
11 20070830 \ n2
19 20.070.719 \ n3
21 20.070.719 \ n4
23 20.070.719 \ n5
26 20.070.911 \ n7
29 20.070.918 \ n8
31 0.070.816 \ n9
34 20.070.925 \ n10

Dies ist, wenn LstInvDt dtype int64 ist.

+2

'to_datetime' akzeptiert ein Format-String so' pd.to_datetime (str (t), format = '% Y% m% d') 'sollte funktionieren:' In [92]: t = 20070530 pd.to_datetime (str (t), format = '% Y% m % d ') Out [92]: Timestamp (' 2007-05-30 00:00:00 ') ' – EdChum

+0

Um ehrlich zu sein dachte ich, es war" uff-8 ", aber offensichtlich passiert etwas, was ich nicht bin bewusst. Ich werde wieder auf den sql-Import-Teil schauen müssen ... Danke für deine Hilfe @EdChum. Sie haben meine Frage beantwortet, also werde ich Ihre Antwort als akzeptiert prüfen. Sieht so aus, als ob ich die meisten von heute benutzen werde, um das herauszufinden ... – Rookie

+0

Es sieht für mich so aus, als ob der neue Zeilen-Charakter nicht entfernt wird, aber es ist ein bisschen verwirrend, wo/warum man eine Index-Ordnungszahl zu haben scheint, Ich würde vergleichen, was in Ihrer Datenbank gespeichert ist und vergleichen Sie mit dem Exportieren von CSV – EdChum

Antwort

26

to_datetime akzeptiert einen Format-String:

In [92]: 

t = 20070530 
pd.to_datetime(str(t), format='%Y%m%d') 
Out[92]: 
Timestamp('2007-05-30 00:00:00') 

Beispiel:

In [94]: 

t = 20070530 
df = pd.DataFrame({'date':[t]*10}) 
df 
Out[94]: 
     date 
0 20070530 
1 20070530 
2 20070530 
3 20070530 
4 20070530 
5 20070530 
6 20070530 
7 20070530 
8 20070530 
9 20070530 
In [98]: 

df['DateTime'] = df['date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d')) 
df 
Out[98]: 
     date DateTime 
0 20070530 2007-05-30 
1 20070530 2007-05-30 
2 20070530 2007-05-30 
3 20070530 2007-05-30 
4 20070530 2007-05-30 
5 20070530 2007-05-30 
6 20070530 2007-05-30 
7 20070530 2007-05-30 
8 20070530 2007-05-30 
9 20070530 2007-05-30 
In [99]: 

df.dtypes 
Out[99]: 
date     int64 
DateTime datetime64[ns] 
dtype: object 

EDIT

Eigentlich ist es schneller den Typen Zeichenfolge zu konvertieren und dann die gesamte Serie zu einem konvertieren datetime statt aufrufen gilt für jeden Wert:

In [102]: 

df['DateTime'] = pd.to_datetime(df['date'].astype(str), format='%Y%m%d') 
df 
Out[102]: 
     date DateTime 
0 20070530 2007-05-30 
1 20070530 2007-05-30 
2 20070530 2007-05-30 
3 20070530 2007-05-30 
4 20070530 2007-05-30 
5 20070530 2007-05-30 
6 20070530 2007-05-30 
7 20070530 2007-05-30 
8 20070530 2007-05-30 
9 20070530 2007-05-30 

Timings

In [104]: 

%timeit df['date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d')) 

100 loops, best of 3: 2.55 ms per loop 
In [105]: 

%timeit pd.to_datetime(df['date'].astype(str), format='%Y%m%d') 
1000 loops, best of 3: 396 µs per loop 
+0

Vielen Dank für die schnelle Antwort @EdChum Das ist eine gute Antwort. Der Grund, warum es für mich nicht funktioniert, scheint ein Codierungsproblem zu sein; 'Zeitdaten '0 20070620 \ n1 20070819 \ n2 20070719 \ n3 20070719 \ n4 20070719 \ n5 20080227 \ n6 20070911 \ n7 20070918 \ n8 20070816 \ n9 20070925 \ n10 20070719 \ n11 20070725 \ n12 Name: LstInvDt, Länge: 17252, dtype : int64 'stimmt nicht mit Format'% Y% m% d''überein – Rookie