【问题标题】:Using Python calculate an employee tenure with a company X使用 Python 计算公司 X 的员工任期
【发布时间】:2020-04-25 08:08:45
【问题描述】:

我有一种情况,我需要计算员工在 X 公司的任期(以年为单位)。数据格式如下:

df =

EID      Event_Name                Event_Date
1        Hired                     03/09/1990  00:00:00
1        Terminated                14/10/2005  00:00:00
1        Rehired                   02/11/2015  00:00:00
2        Hired                     03/10/1990  00:00:00
2        Terminated                15/10/2005  00:00:00

任期计算很容易理解:

首先计算 Hired 和 Terminated 之间的差异 其次计算今天的日期和 Rehired 之间的差异(如果 rehired 适用,则忽略)

示例:对于 EID =1:任期为:

  (LAST JOB WORKED WITH COMPANY X)         14/10/2005  00:00:00 - 03/09/1990  00:00:00 = 5520 days
  (REHIRED WITH COMP X AND STILL WORKING)  25/04/2020  00:00:00 - 02/11/2015  00:00:00 = 1636 days

总任职天数 = (5520 + 1636)/365 = 19.6 年
其他 EID 也是如此

输出应如下所示:

 EID      Tenure(Years)               
 1        19.6
 2        15.04

【问题讨论】:

    标签: python-3.x pandas datetime date-difference


    【解决方案1】:

    如果Event_Name 列中每组的Terminated 值从不连续,则解决方案有效:

    #converting to datetimes
    df['Event_Date'] = pd.to_datetime(df['Event_Date'], dayfirst=True)
    
    #today datetime
    now = pd.Timestamp.now().floor('d')
    #shifted rows per groups for terminated Event_Date 
    df['new'] = df.groupby('EID')['Event_Date'].shift(-1).fillna(now)
    #removed rows with Terminated
    df = df[df['Event_Name'].ne('Terminated')].copy() 
    #difference
    df['Tenure(Years)'] = df['new'].sub(df['Event_Date'])
    #aggregate sum
    df = df.groupby('EID')['Tenure(Years)'].sum().dt.days.div(365).reset_index()
    print (df)
       EID  Tenure(Years)
    0    1      19.605479
    1    2      15.043836
    

    【讨论】:

    • 让我快速检查一下,我会告诉你的!
    • @Django0602 - 如果解决方案有问题,我认为原因是 Event_Name 值的顺序不同
    • 这简直太棒了!非常感谢@jezrael!它工作正常,因为没有任何 ID 连续出现终止的事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多