Ошибка атрибута: объект ‘TimedeltaProperties’ не имеет атрибута «годы» в Панд

#python #python-3.x #pandas

Вопрос:

В Панд, почему у TimedeltaProperties объекта нет атрибута «годы»?

В конце концов, datetime объект обладает этим свойством.

Это кажется очень естественной вещью для объекта, который озабочен тем, чтобы иметь время. Особенно, если у него уже есть атрибут часов, секунд и т. Д.

Есть ли обходной путь, чтобы моя колонка, которая полна таких значений, как
10060 days ,
может быть преобразовано в годы? Или еще лучше, просто преобразовать в целочисленное представление в течение многих лет?

Комментарии:

1. Потому что количество дней в одном году не является точным значением.

2. datetime У A нет years атрибута. У него есть year атрибут, потому что сказать, что определенная дата и время в 2009 году, просто и в основном четко определено. Не так просто сказать, сколько лет длится определенная продолжительность; является ли год 365 днями? 366? Должны ли мы отслеживать, когда начинается и заканчивается тайм-аут, чтобы принять решение?

3. Даже там f["age_diff"] = f["date2"] - f["date1"] , где Панды недостаточно умны, чтобы понять, сколько лет (с плавающей запятой) это?

4. Также обратите внимание, что причина TimedeltaProperties отсутствия такого атрибута заключается в том, что pd.Timedelta datetime.timedelta объект или (первый является подклассом второго) не имеет такого атрибута. И это действительно по причинам, изложенным выше.

Ответ №1:

TimedeltaProperties не имеет year month атрибутов или, потому что в соответствии с исходным кодом TimedeltaProperties . Это —

Объект доступа для временных свойств значений рядов.

Но months или years не имеют постоянного определения.

1 month может занимать разное количество дней, в зависимости от month самого, например, январь -> 31 день , апрель ->> 30 дней и т.д.

1 month также может принимать различные значения в зависимости от года (в случае месяца февраль) , если год 2004 , в феврале 29 дней , если год 2003, в феврале 28 дней и т. Д.

То же самое относится и к years тому , что он может принимать разные значения, например , в зависимости от того, какой это точный год — если 2003 год, то в нем 365 дней, если 2004 год, то 366 дней.

Следовательно, требование типа — Преобразовать 10060 days в years не является точным, что years ?

Как уже говорилось ранее, точного количества лет у тех нет. количество дней соответствует в зависимости от фактических лет, которые представляют эти дни.

Ответ №2:

Этот обходной путь приближает вас.

round((df["Accident Date"] - df["Iw Date Of Birth"]).dt.days / 365, 1)

Ответ №3:

Я использовал .astype(‘timedelta64[Y]’), а затем .astype(‘int’), чтобы получить целочисленные годы:

 df['age'] = (pd.Timestamp('now') - df.birthDate).astype('timedelta64[Y]').astype('int')
 

Выход:

 nflId   height  weight  birthDate   collegeName           position  displayName    age
0   2539334 72  190 1990-09-10      Washington              CB  Desmond Trufant    30
1   2539653 70  186 1988-11-01      Southeastern Louisiana  CB  Robert Alford      31
2   2543850 69  186 1991-12-18      Purdue                  SS  Ricardo Allen      28
3   2555162 73  227 1994-11-04      Louisiana State         MLB Deion Jones        25
4   2555255 75  232 1993-07-01      Minnesota               OLB DeVondre Campbell  27