В Pandas как преобразовать строку строк даты в объекты datetime и поместить их в DataFrame?
import pandas as pd
date_stngs = ('2008-12-20','2008-12-21','2008-12-22','2008-12-23')
a = pd.Series(range(4),index = (range(4)))
for idx, date in enumerate(date_stngs):
a[idx]= pd.to_datetime(date)
Этот бит кода вызывает ошибку:
TypeError: "Объект 'int iserable"
Может ли кто-нибудь сказать мне, как получить эту строку строк даты в DataFrame как объекты DateTime
?
Ответы
Ответ 1
>>> import pandas as pd
>>> date_stngs = ('2008-12-20','2008-12-21','2008-12-22','2008-12-23')
>>> a = pd.Series([pd.to_datetime(date) for date in date_stngs])
>>> a
0 2008-12-20 00:00:00
1 2008-12-21 00:00:00
2 2008-12-22 00:00:00
3 2008-12-23 00:00:00
UPDATE
Используйте pandas.to_datetime (pd.Series(..)). Это кратким и намного быстрее, чем предыдущий код.
>>> pd.to_datetime(pd.Series(date_stngs))
0 2008-12-20 00:00:00
1 2008-12-21 00:00:00
2 2008-12-22 00:00:00
3 2008-12-23 00:00:00
Ответ 2
In [46]: pd.to_datetime(pd.Series(date_stngs))
Out[46]:
0 2008-12-20 00:00:00
1 2008-12-21 00:00:00
2 2008-12-22 00:00:00
3 2008-12-23 00:00:00
dtype: datetime64[ns]
Обновление: ориентир
In [43]: dates = [(dt.datetime(1960, 1, 1)+dt.timedelta(days=i)).date().isoformat() for i in range(20000)]
In [44]: timeit pd.Series([pd.to_datetime(date) for date in dates])
1 loops, best of 3: 1.71 s per loop
In [45]: timeit pd.to_datetime(pd.Series(dates))
100 loops, best of 3: 5.71 ms per loop
Ответ 3
Простое решение включает конструктор Серии. Вы можете просто передать тип данных в параметр dtype
. Кроме того, теперь функция to_datetime
может принимать последовательность строк.
Создать данные
date_strings = ('2008-12-20','2008-12-21','2008-12-22','2008-12-23')
Все три производят одно и то же
pd.Series(date_strings, dtype='datetime64[ns]')
pd.Series(pd.to_datetime(date_strings))
pd.to_datetime(pd.Series(date_strings))
Бенчмарки
Контрольные показатели, предоставленные @waitingkuo, неверны. Первый метод немного медленнее, чем два других, которые имеют одинаковую производительность.
import datetime as dt
dates = [(dt.datetime(1960, 1, 1)+dt.timedelta(days=i)).date().isoformat()
for i in range(20000)] * 100
%timeit pd.Series(dates, dtype='datetime64[ns]')
730 ms ± 9.06 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit pd.Series(pd.to_datetime(dates))
426 ms ± 3.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit pd.to_datetime(pd.Series(dates))
430 ms ± 5.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)