AttributeError: у объекта 'NoneType' нет атрибута 'year' (происходит при переборе списка, пытающегося преобразовать даты) - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь преобразовать дни рождения в списке в годы. Даты - это строки.

bday_list: ['1990-01-01', '1991-01-01', '1992-01-01']

до

bday_list: [30, 29, 28]

Используя python3, мой код для преобразования:

for i in range(bday_list_length):

    pd.to_datetime('today').year - pd.to_datetime(bday_list[i]).year

Однако, когда я запускаю это: я получаю следующую ошибку:

Traceback (последний вызов был последним): файл "C: / Users / user / PycharmProjects / DBlytics / notebook / poc / ageData.py", строка 60, в pd.to_datetime ('today') ) .year - pd.to_datetime (bday_list [i]). year AttributeError: объект 'NoneType' не имеет атрибута 'year'

Однако, когда я запускаю следующее за пределами l oop , он конвертируется.

    pd.to_datetime('today').year - pd.to_datetime(bday_list[i]).year

Я не уверен, что я делаю неправильно.

Ответы [ 4 ]

1 голос
/ 10 апреля 2020

В pandas работа с массивами, поэтому удалите только [i], а также добавьте errors='coerce' для преобразования неверных данных - решение преобразует значения в NaT:

bday_list = ['1990-01-01', '1991-01-01', '1992-01-01', 'wrong']

print (pd.to_datetime(bday_list, errors='coerce'))
DatetimeIndex(['1990-01-01', '1991-01-01', '1992-01-01', 'NaT'], 
dtype='datetime64[ns]', freq=None)

out = pd.to_datetime('today').year - pd.to_datetime(bday_list, errors='coerce').year
print (out)
Float64Index([30.0, 29.0, 28.0, nan], dtype='float64')
0 голосов
/ 10 апреля 2020

import datetime import pandas as pd date_list = ['1990-01-01', '1991-01-01', '1992-01-01'] date_list = [pd.to_datetime(date) for date in date_list] age_list = [int(datetime.now().strftime('%Y')) - int(date.strftime('%Y')) for date in date_list]

Это просто !!, просто используйте приведенный выше код ..

0 голосов
/ 10 апреля 2020

Я предлагаю вам использовать простой python для решения вышеуказанной задачи. Нет необходимости вызывать pandas при просмотре списка. Кроме того, вы можете использовать понимание списка.

from typing import List
import datetime as dt


bday_list: List[str] = ["1990-01-01", "1991-01-01", "1992-01-01"]
bday_list_dates = [dt.datetime.strptime(x, "%Y-%m-%d") for x in bday_list]
today = dt.date.today()
year_of_age = [today.year - x.year for x in bday_list_dates]
print(year_of_age)
0 голосов
/ 10 апреля 2020
from datetime import datetime
bday_list = ['1990-01-01', '1991-01-01', '1992-01-01']
for date in bday_list:
     print(datetime.today().year - datetime.strptime(date,'%Y-%m-%d').year)

Используя datetime, я извлекаю год текущей даты, вычтенный из года, извлеченного из строки в bday_list, после преобразования ее в формат даты с использованием strptime ()

...