在python中透视数据

dee*_*esh 3 python pivot date dataframe pandas

我正在计算员工的出勤率,这是示例表

df = pd.DataFrame({
    'E_ID': [1001, 1001, 1001, 1002, 1002, 1002, 1002],
    'Date': [
        '28-07-2019 08:27:00',
        '28-07-2019 18:10:00',
        '29-07-2019 08:10:00',
        '28-07-2019 08:07:00',
        '29-07-2019 08:10:10',
        '29-07-2019 08:10:17',
        '29-07-2019 17:50:00'
     ]
})
Run Code Online (Sandbox Code Playgroud)

我正在尝试从的Date列中计算每天的In-Time和Out-Time df

此外,每天可能会有一次输入,可以视为“按时上班”。

In-Time将是第一个打入 ,而 Out-Time将是最后一个打入。

我期望输出这样的东西,或者可能是类似的东西

E_ID    OfficePunch   In Punch           Out Punch
1001    28-08-2019    28-07-2019 08:27   28-07-2019 18:10
1001    29-08-2019    29-07-2019 08:10   29-07-2019 08:10
1002    28-08-2019    28-07-2019 08:07   28-07-2019 08:07
1002    29-08-2019    29-07-2019 08:10   29-07-2019 17:50
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到?

jez*_*ael 7

对于输出OfficePunch列中的python对象日期,请使用first和last值Series.dt.date进行合计GroupBy.agg

df['Date'] = pd.to_datetime(df['Date'])

df1 = (df.groupby(['E_ID', df['Date'].dt.date.rename('OfficePunch')])['Date']
        .agg([('In Punch','first'),('Out Punch','last')])
        .reset_index())
print (df1)
   E_ID OfficePunch            In Punch           Out Punch
0  1001  2019-07-28 2019-07-28 08:27:00 2019-07-28 18:10:00
1  1001  2019-07-29 2019-07-29 08:10:00 2019-07-29 08:10:00
2  1002  2019-07-28 2019-07-28 08:07:00 2019-07-28 08:07:00
3  1002  2019-07-29 2019-07-29 08:10:10 2019-07-29 17:50:00

print (df1.dtypes)
E_ID                    int64
OfficePunch            object
In Punch       datetime64[ns]
Out Punch      datetime64[ns]
dtype: object
Run Code Online (Sandbox Code Playgroud)

如果需要在OfficePunch列中使用日期时间,请使用Series.dt.floor

df['Date'] = pd.to_datetime(df['Date'])

df1 = (df.groupby(['E_ID', df['Date'].dt.floor('d').rename('OfficePunch')])['Date']
        .agg([('In Punch','first'),('Out Punch','last')])
        .reset_index())
print (df1)
   E_ID OfficePunch            In Punch           Out Punch
0  1001  2019-07-28 2019-07-28 08:27:00 2019-07-28 18:10:00
1  1001  2019-07-29 2019-07-29 08:10:00 2019-07-29 08:10:00
2  1002  2019-07-28 2019-07-28 08:07:00 2019-07-28 08:07:00
3  1002  2019-07-29 2019-07-29 08:10:10 2019-07-29 17:50:00

print (df1.dtypes)
E_ID                    int64
OfficePunch    datetime64[ns]
In Punch       datetime64[ns]
Out Punch      datetime64[ns]
dtype: object
Run Code Online (Sandbox Code Playgroud)