#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