Ошибка атрибута :: объект datetime.date не имеет атрибута split - PullRequest
0 голосов
/ 13 октября 2018

Что можно сделать, чтобы избежать ошибки, возникающей при попытке разбить datetime?Я пытаюсь разделить datetime на компоненты года, месяца и даты.

# Split the  date (This converts each observation into a list)
previous_loans['firstduedate'] = previous_loans['firstduedate'].apply(lambda x: x.split('-'))

# Convert all elements in each observation(list) from str to int
previous_loans['firstduedate'] = previous_loans['firstduedate'].apply(lambda x: [int(y) for y in x ])

# Convert each observation into a date format
previous_loans['firstduedate'] = previous_loans['firstduedate'].apply(lambda x : date(x[0], x[1], x[2]), datetime=True)

Я получаю ошибку

Attribute error ::datetime.date obect has no attribute 'split'

1 Ответ

0 голосов
/ 13 октября 2018

Есть, по крайней мере, три проблемы, с которыми вы пытаетесь достичь:

  1. Не используйте datetime.date объекты в серии Панд.Используйте Pandas-friendly pd.Timestamp для создания серии datetime с помощью pd.to_datetime.Это позволяет вам использовать преимущества массивов NumPy и эффективных векторизованных операций.
  2. Объекты Date, datetime.date или pd.Timestamp, хранятся внутри целых чисел, а не строк.Так что не пытайтесь «разделить» их с помощью str.split.
  3. 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]
...