2014-12-16 10 views
13

Przepraszamy za to, ale po dwóch godzinach szukania i próbowania nie mogę uzyskać właściwej odpowiedzi tutaj. Mam ramkę danych, zapełnioną przez pandas io sql.read_frame(). Kolumna, która okazuje się być dla mnie za dużo, to dtypeint64. Liczby całkowite mają format YYYYMMDD. na przykład 20070530 - 30 maja 2007 r. Próbowałem szeregu podejść, najbardziej oczywistych;Python pandy integer YYYYMMDD na datetime

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

z wieloma zmianami w funkcji różnych parametrów.

Wynik był w najlepszym wypadku terminem interpretowanym jako czas. Data jest ustawiona na 1970-01-01 - wynik jak w powyższym przykładzie: 1970-01-01 00:00:00.020070530

Próbowałem także różnych funkcji .map() znalezionych w postach symultanicznych.

Zauważyłem, że według np.date_range() można interpretować wartości ciągów w formacie YYYYMMDD, ale jest to najbliższy, że przyszedłem do rozwiązania.

Jeśli ktoś ma odpowiedź, byłbym bardzo wdzięczny!

EDYCJA: W związku z odpowiedzią Eda Chuma problem najprawdopodobniej jest związany z kodowaniem. rep() na podzbiorze plonów dataFrame:

OrdNo LstInvDt \ n0
9 20070620 \ n1
11 20070830 \ n2
19 20070719 \ n3
21 20070719 \ N4
23 20070719 \ N5
26 20070911 \ N7
29 20070918 \ n8
31 0070816 \ n9
34 20070925 \ n10

To jest, gdy LstInvDt jest dtype int64.

+2

'to_datetime' akceptuje ciąg formatu więc' pd.to_datetime (str (t), format = '% Y% m% d') 'powinno działać:' W [92]: t = 20070530 pd.to_datetime (str (t), format = '% Y% m % d ') Out [92]: Timestamp (' 2007-05-30 00:00:00 ') ' – EdChum

+0

Szczerze mówiąc myślałem, że to" uff-8 ", ale oczywiście coś się dzieje, że nie jestem świadomy. Będę musiał ponownie zapoznać się z częścią importu sql ... Dziękuję za pomoc @EdChum. Odpowiedziałeś na moje pytanie, więc sprawdzę twoją odpowiedź jako zaakceptowaną. Wygląda na to, że wykorzystam większość dzisiejszych prób, aby dowiedzieć się tego ... – Rookie

+0

Wygląda na to, że nowa linia nie jest usuwana, ale jest trochę mylące gdzie/dlaczego wydaje się, że masz po nim porządek indeksowy, Porównałbym to, co jest przechowywane w DB i porównać z eksportowaniem do csv – EdChum

Odpowiedz

26

to_datetime akceptuje ciąg formatu:

In [92]: 

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

przykład:

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

Właściwie to szybciej przekonwertować typu ciąg, a następnie przekonwertować całą szeregowo z datetime zamiast wywoływania stosuje się dla każdej wartości:

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 

czasy

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

Dziękuję za szybką odpowiedź @EdChum To jest dobra odpowiedź. Powód, dla którego nie działa dla mnie, wygląda na problem z kodowaniem; 'dane czasowe '0 20070620 \ n1 20070830 \ n2 20070719 \ n3 20070719 \ n4 20070719 \ n5 20080227 \ n6 20070911 \ n7 20070918 \ n8 20070816 \ n9 20070925 \ n10 20070719 \ n11 20070725 \ n12 Nazwa: LstInvDt, długość: 17252, dtype : int64 "nie pasuje do formatu"% Y% m% d'' – Rookie