Есть, по крайней мере, три проблемы, с которыми вы пытаетесь достичь:
- Не используйте
datetime.date
объекты в серии Панд.Используйте Pandas-friendly pd.Timestamp
для создания серии datetime
с помощью pd.to_datetime
.Это позволяет вам использовать преимущества массивов NumPy и эффективных векторизованных операций. - Объекты Date,
datetime.date
или pd.Timestamp
, хранятся внутри целых чисел, а не строк.Так что не пытайтесь «разделить» их с помощью str.split
. str.split
возвращает список.Это анти-Панда, поскольку это означает, что вы храните два слоя указателей, ряд списков, которые сами содержат указатели.Вместо этого создайте int
столбцы для представления компонентов ваших дат.
Это один из подходов:
from datetime import date
df = pd.DataFrame({'date': [date(2018, 1, 1), date(2018, 5, 20), date(2018, 9, 11)]})
df['date'] = pd.to_datetime(df['date'])
L = ['year', 'month', 'day']
df = df.join(pd.concat([getattr(df['date'].dt, i).rename(i) for i in L], axis=1))
print(df)
date year month day
0 2018-01-01 2018 1 1
1 2018-05-20 2018 5 20
2 2018-09-11 2018 9 11
Чтобы ваш код работал с datetime.date
объектамивозможно, но сначала требует преобразования строк и оставляет вам серию списков.Ни метод, ни результат не рекомендуются:
# AttributeError: 'datetime.date' object has no attribute 'split'
# df['date_split'] = df['date'].apply(lambda x: x.split('-'))
df['date_split'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d').split('-'))
print(df)
date date_split
0 2018-01-01 [2018, 01, 01]
1 2018-05-20 [2018, 05, 20]
2 2018-09-11 [2018, 09, 11]