2014-12-16 2 views
13

Извиняюсь заранее за это, но после двух часов поиска и попытки я не могу получить правильный ответ здесь. У меня есть кадр данных, заполненный через pandas io sql.read_frame(). Столбец, который оказывается слишком большим для меня, составляет dtypeint64. Целые числа имеют формат YYYYMMDD. например, 20070530 - 30 мая 2007 года. Я пробовал ряд подходов, наиболее очевидное существо;Python pandas integer YYYYMMDD to datetime

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

с несколькими вариациями на функции различных параметров.

В результате, в лучшем случае, данная дата интерпретируется как время. Дата установлена ​​на 1970-01-01 - результат, приведенный выше, пример 1970-01-01 00:00:00.020070530

Я также пробовал различные функции .map(), найденные в сообщениях-симуляторах.

Я заметил, что в соответствии с np.date_range() можно интерпретировать строковые значения формата YYYYMMDD, но это самый близкий я пришел к решению.

Если у кого-то есть ответ, я был бы очень благодарен!

EDIT: В связи с ответом Эд Чама проблема, скорее всего, связана с кодированием. rep() на подмножестве выходов dataFrame:

OrdNo LstInvDt \ n0
9 20070620 \ n1
11 20070830 \ п2
19 20070719 \ n3
21 20070719 \ n4
23 20070719 \ n5
26 20070911 \ n7
29 20070918 \ n8
31 0070816 \ n9
34 20070925 \ n10

Это когда LstInvDt является dtype int64.

+2

'to_datetime' принимает строку формата так' PD.to_datetime (str (t), format = '% Y% m% d') 'должно работать:' В [92]: t = 20070530 pd.to_datetime (str (t), format = '% Y% m % d ') Out [92]: Timestamp (' 2007-05-30 00:00:00 ') ' – EdChum

+0

Если честно, я думал, что это' uff-8', но, очевидно, что-то происходит, осознавая. Мне придется снова просмотреть часть импорта sql ... Спасибо за помощь @EdChum. Вы ответили на мой вопрос, поэтому я проверю ваш ответ как принятый. Похоже, я буду использовать большую часть сегодняшнего дня, пытаясь выяснить это ... – Rookie

+0

Мне кажется, что новый символ линии не удаляется, но это немного запутывает, где/почему у вас, кажется, есть порядковый индекс, следующий за ним, Я бы сравнил с тем, что хранится в вашей БД, и сравним с экспортом в csv – EdChum

ответ

26

to_datetime принимает строку формата:

In [92]: 

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

пример:

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

На самом деле это быстрее, чтобы преобразовать тип в строку, а затем преобразовать всю серию к datetime, а не вызов применяются для каждого значения:

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 

тайминги

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

Спасибо за быстрый ответ @EdChum Это хороший ответ. Причина, по которой он не работает для меня, выглядит проблемой кодирования; 'time data '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 Имя: LstInvDt, Длина: 17252, тип dtype : int64 'не соответствует формату'% Y% m% d'' – Rookie