Python 如何查找“开始”列和“结束”列定义的时间间隔之间的总时间

Python 如何查找“开始”列和“结束”列定义的时间间隔之间的总时间,python,pandas,dataframe,pandas-groupby,timedelta,Python,Pandas,Dataframe,Pandas Groupby,Timedelta,我有一个数据框: 我想用以下方法计算确认和取消之间的差异: 日期为2020年1月13日,办公桌id为1.0:10:35:00–8:00:00+12:36:00–11:36:00+20:00:00–13:36:00 我只能在一个有一小时确认和取消的办公桌上执行这些操作。我所说的一小时是指在桌面id的日期中,我只有一行用于确认和取消时间。当我从确认8:00:00和20:00:00减去取消时间并将它们相加时,我得到了有趣的差异 好几个小时,我都无法把它组合起来。我所说的“mamy hour”是指一个

我有一个数据框:

我想用以下方法计算确认和取消之间的差异:

日期为2020年1月13日,办公桌id为1.0:10:35:00–8:00:00+12:36:00–11:36:00+20:00:00–13:36:00

我只能在一个有一小时确认和取消的办公桌上执行这些操作。我所说的一小时是指在桌面id的日期中,我只有一行用于确认和取消时间。当我从确认8:00:00和20:00:00减去取消时间并将它们相加时,我得到了有趣的差异

好几个小时,我都无法把它组合起来。我所说的“mamy hour”是指一个日期中的桌面id有几行带有“取消”和“确认”时间。我想选择日期、办公桌id并计算办公桌占用时间-每个办公桌的确认和取消之间的差异

输出应如下所示:

我想找出办公桌空闲的时间段。 在我的数据中,一个日期内可以有多个确认和取消

我做了一个小时确认和取消:

df_1['confirm']=pd.to_timedelta(df_1['confirm'].astype(str))
df_1['diff_confirm']=df_1['confirm'].apply(lambda x:x-datetime.timedelta(天=0,小时=8,分钟=0))
df_1['cancel']=pd.to_timedelta(df_1['cancel'].astype(str))
df_1['diff_cancel']=df_1['cancel'].apply(lambda x:datetime.timedelta(天=0,小时=20,分钟=0)-x)
这是有效的


有什么提示吗?

您并没有完全清楚地说明您需要结果的格式,但我认为可以将它们放在单独的数据框中。因此,此解决方案对由
date
desk_id
值定义的每组行进行操作,并计算每组的总时间,输出放在新的数据帧中:

from datetime import timedelta
import pandas as pd

df = pd.DataFrame(
    {
        'date': [pd.Timestamp('2020-1-13'), pd.Timestamp('2020-1-13'),
                 pd.Timestamp('2020-1-13'), pd.Timestamp('2020-1-14'),
                 pd.Timestamp('2020-1-14'), pd.Timestamp('2020-1-14')],
        'desk_id': [1.0, 1.0, 2.0, 1.0, 2.0, 2.0],
        'confirm': ['10:36:00', '12:36:00', '09:36:00', '10:36:00', '12:36:00',
                    '15:36:00'],
        'cancel': ['11:36:00', '13:36:00', '11:36:00', '11:36:00', '14:36:00',
                   '16:36:00']
    }
)
创建输入数据帧的代码:

from datetime import timedelta
import pandas as pd

df = pd.DataFrame(
    {
        'date': [pd.Timestamp('2020-1-13'), pd.Timestamp('2020-1-13'),
                 pd.Timestamp('2020-1-13'), pd.Timestamp('2020-1-14'),
                 pd.Timestamp('2020-1-14'), pd.Timestamp('2020-1-14')],
        'desk_id': [1.0, 1.0, 2.0, 1.0, 2.0, 2.0],
        'confirm': ['10:36:00', '12:36:00', '09:36:00', '10:36:00', '12:36:00',
                    '15:36:00'],
        'cancel': ['11:36:00', '13:36:00', '11:36:00', '11:36:00', '14:36:00',
                   '16:36:00']
    }
)
解决方案:

df['confirm'] = pd.to_timedelta(df['confirm'])
df['cancel'] = pd.to_timedelta(df['cancel'])

# function to compute total time each desk is free
def total_time(df):
    return (
        (df.iloc[0]['confirm'] - timedelta(days=0, hours=8, minutes=0)) +
        (df['confirm'] - df['cancel'].shift()).sum() +
        (timedelta(days=0, hours=20, minutes=0) - df.iloc[-1]['cancel'])
    )

# apply function to each combination of 'desk_id' and 'date', producing
# a new dataframe
df.groupby(['desk_id', 'date']).apply(total_time).reset_index(name='total_time')


#    desk_id          date       total_time
# 0      1.0    2020-01-13  0 days 10:00:00
# 1      1.0    2020-01-14  0 days 11:00:00
# 2      2.0    2020-01-13  0 days 10:00:00
# 3      2.0    2020-01-14  0 days 09:00:00


该函数取
confirm
的第一个值与8:00:00之间的差值,取每个
confirm
与前面的
cancel
值之间的差值,然后取20:00:00与
cancel
的最后一个值之间的差值。这些差异加在一起就产生了最终的价值。

猜猜你想做什么(我仍然不能完全理解,但这里有一个尝试):

它给出了输出:

         data  desk_id      total_time
0  2020-01-13      1.0 0 days 10:00:00
1  2020-01-14      1.0 0 days 11:30:00
这里的关键是使用.groupby()函数,然后我们可以将其相加,以基本上执行以下等式:

总时间=20:00+总和确认次数-总和取消次数-08:00


谢谢你纠正这些问题!确认和取消的“一小时”或“多小时”是什么意思?您是指
确认
取消
列中的值之间的差异吗?请添加预期输出(您希望从提供的输入中获得什么),并阐明您希望实现的计算逻辑。“许多小时”需要执行的计算是什么?与“一小时”的计算有何不同?谢谢您的评论!我更正了,问题现在可以理解了吗?问题缺少一些数据。但从你所给予的,我无法理解这些。如果我说错了什么,请纠正我,请确保在问题中也包括这些。1) 工作从08:00开始到20:00结束2)你想计算每天和每个办公桌ID的工作时间,但我真正不明白的是你说你的代码工作正常。我不太明白你想用它做什么。非常感谢!如果这个答案解决了您的问题,请选择或批准它,谢谢:)非常感谢!