代码之家  ›  专栏  ›  技术社区  ›  leofer

如何计算不同熊猫栏中两个日期之间的年数

  •  4
  • leofer  · 技术社区  · 8 年前

    import pandas as pd
    import datetime
    from dateutil.relativedelta import relativedelta
    
    # the dataframe - id column always starts with year, month and day
    df = pd.DataFrame({'id': ['19520630F8', '19680321A5', '19711113E2'],
                       'dte': ['2010-06-02', '2007-08-12', '2013-01-23']})
    
    # create a date string from df['id'] to the format yyyy-mm-dd
    dob = (df['id'].str[:4] + '-' +
           df['id'].str[4:6] + '-' +
           df['id'].str[6:8])
    
    # calculate age (years only) at df['dte']
    df['age'] = relativedelta(date, dob).years
    

    我收到错误消息:

    我不理解我的数据的模糊性,以及在哪里应用这些空的/bool/项… df['dta'] 列if的对象数据类型不是datetime,而是将dob的创建包装在 pd.to_datetime

    编辑

              dte          id  age
    0  2010-06-02  19520630F8   57
    1  2007-08-12  19680321A5   39
    2  2013-01-23  19711113E2   41
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   jezrael    8 年前

    我认为需要:

    df['age'] = (np.floor((pd.to_datetime(df['dte']) - 
                 pd.to_datetime(dob)).dt.days / 365.25)).astype(int)
    print (df)
               id         dte  age
    0  19520630F8  2010-06-02   57
    1  19680321A5  2007-08-12   39
    2  19711113E2  2013-01-23   41
    

    将列转换为日期时间并减去:

    print (pd.to_datetime(df['dte']) -  pd.to_datetime(dob))
    0   21156 days
    1   14388 days
    2   15047 days
    dtype: timedelta64[ns]
    

    print ((pd.to_datetime(df['dte']) -  pd.to_datetime(dob)).dt.days / 365.25)
    0    57.921971
    1    39.392197
    2    41.196441
    dtype: float64
    

    最后一个 floor numpy.floor.

    print ((np.floor((pd.to_datetime(df['dte']) - pd.to_datetime(dob)).dt.days / 365.25)))
    0    57.0
    1    39.0
    2    41.0
    dtype: float64
    
        2
  •  1
  •   jpp    8 年前

    dateutil.relativedelta datetime 在计算中使用它们之前的序列。

    df['id_dte'] = pd.to_datetime(df['id'].str[:8], format='%Y%m%d')
    df['dte'] = pd.to_datetime(df['dte'])
    
    df['age'] = [relativedelta(a, b).years for a, b in zip(df['dte'], df['id_dte'])]
    
    print(df)
    
             dte          id     id_dte  age
    0 2010-06-02  19520630F8 1952-06-30   57
    1 2007-08-12  19680321A5 1968-03-21   39
    2 2013-01-23  19711113E2 1971-11-13   41
    

    直接属性:

    df['age'] = df['dte'].dt.year - df['id_dte'].dt.year
    
    print(df)
    
             dte          id     id_dte  age
    0 2010-06-02  19520630F8 1952-06-30   58
    1 2007-08-12  19680321A5 1968-03-21   39
    2 2013-01-23  19711113E2 1971-11-13   42