Подтвердить что ты не робот

Python pandas целое число YYYYMMDD в datetime

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

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\n2
19 20070719\n3
21 20070719\n4
23 20070719\n5
26 20070911\n7
29 20070918\n8
31 0070816\n9
34 20070925\n10

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

4b9b3361

Ответ 1

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

ИЗМЕНИТЬ

На самом деле быстрее преобразовать тип в строку, а затем преобразовать всю серию в 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