Afternoon All,
Looking for the number of years between two dates to 4 decimal places. My Data:
df_Years = df[
df['state'].str.contains('Done')
][[
'maturity_date'
]].copy()
df_Years['maturity_date'] = pd.to_datetime(df_Date['maturity_date'])
df_Years['Today'] = pd.to_datetime('today')
display(df_Years.head(6))
maturity_date Today
13 2022-12-15 2018-03-21
81 2028-02-15 2018-03-21
82 2045-12-01 2018-03-21
100 2025-08-18 2018-03-21
115 2019-01-16 2018-03-21
116 2018-12-21 2018-03-21
display(df_Years.dtypes)
maturity_date datetime64[ns]
Today datetime64[ns]
dtype: object
#Dataframe types
Attempt 1:
df_Years['Year_To_Maturity'] = df_Years['maturity_date'] - df_Years['Today']
df_Years['Year_To_Maturity'] = df_Years['Year_To_Maturity'].apply(lambda x: float(x.item().days)/365)
Error:
AttributeError: 'Timedelta' object has no attribute 'item'
Attempt 2:
df_Years['Year_To_Maturity'] = df_Years['maturity_date'] - df_Years['Today']
df_Years['Year_To_Maturity'] = df_Years['Year_To_Maturity'].apply(lambda x: float(x.item().days)/365)
Output:
maturity_date Today Year_To_Maturity
13 2022-12-15 2018-03-21 <map object at 0x00000000143F9C88>
81 2028-02-15 2018-03-21 <map object at 0x00000000143F9C88>
82 2045-12-01 2018-03-21 <map object at 0x00000000143F9C88>
100 2025-08-18 2018-03-21 <map object at 0x00000000143F9C88>
115 2019-01-16 2018-03-21 <map object at 0x00000000143F9C88>
116 2018-12-21 2018-03-21 <map object at 0x00000000143F9C88>
I'd like to know why both don't output the Year_To_Maturity?
I think you need sub
for subtract, convert timedeltas to days by dt.days
, divide by div
and last round
:
df_Years['Year_To_Maturity'] = (df_Years['maturity_date'].sub(df_Years['Today'])
.dt.days
.div(365)
.round(4))
print (df_Years)
maturity_date Today Year_To_Maturity
0 2022-12-15 2018-03-21 4.7397
1 2028-02-15 2018-03-21 9.9123
2 2045-12-01 2018-03-21 27.7178
3 2025-08-18 2018-03-21 7.4164
4 2019-01-16 2018-03-21 0.8247
5 2018-12-21 2018-03-21 0.7534
Thanks @pir for better solution:
df_Years['Year_To_Maturity'] = (df_Years['maturity_date'].sub(df_Years['Today'])
.dt.days
.div(365.25)
.round(4))
print (df_Years)
maturity_date Today Year_To_Maturity
0 2022-12-15 2018-03-21 4.7365
1 2028-02-15 2018-03-21 9.9055
2 2045-12-01 2018-03-21 27.6988
3 2025-08-18 2018-03-21 7.4114
4 2019-01-16 2018-03-21 0.8241
5 2018-12-21 2018-03-21 0.7529
来源:https://stackoverflow.com/questions/49399921/years-between-two-date-column-timedelta-object-has-no-attribute-item