两个日期列之间的年份=' Timedelta'对象没有属性' item'

时间:2018-03-21 06:48:57

标签: pandas dataframe timedelta

  

下午全部,

     

查找两个日期到4位小数之间的年数。我的数据:

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
  

尝试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)
  

错误:

AttributeError: 'Timedelta' object has no attribute 'item'
  

尝试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)
  

输出:

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>
  

我想知道为什么两者都不输出Year_To_Maturity?

1 个答案:

答案 0 :(得分:4)

我认为您需要sub进行减法,将timedeltas转换为dt.days的天数,除以div和最后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

感谢@ 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