计算开放和关闭时间内的时间差异

时间:2019-08-22 14:39:32

标签: python pandas

我的df如下-请使用pd.read_clipboard(sep='\t')复制到您的编辑器中。

    site    start_time  finish_time open_time   close_time  current_variance
1   22/08/2019 15:17    23/08/2019 17:37    09:00   17:00   1 days 02:20:00.000000000
1   12/08/2019 03:30    12/08/2019 08:30    09:00   17:00   0 days 05:00:00.000000000
1   19/08/2019 09:25    20/08/2019 09:15    09:00   17:00   0 days 23:50:00.000000000
2   21/08/2019 06:09    21/08/2019 08:19    09:00   17:00   0 days 02:10:00.000000000
2   16/08/2019 03:03    17/08/2019 10:07    09:00   17:00   1 days 07:04:00.000000000

我要做的是计算网站开放和关闭时间之内的差异。

不包括open_timeclose_time列所设置的任何时间以外的时间。

自然,我的真实数据有许多不同的打开和关闭时间,并且可能要考虑许多不同的变量。数据来自SAP,因此数据在处理时会进入站点,因此可以随时访问。 finish_time是现场处理的时间。我相信以开闭时间计算将解决这里的大多数问题。

预期产量

    site    start_time  finish_time open_time   close_time  actual_variance
1   22/08/2019 15:17    23/08/2019 17:37    09:00   17:00   0 Days 01:43:00
1   12/08/2019 03:30    12/08/2019 08:30    09:00   17:00   0 Days 00:00:00
1   19/08/2019 09:25    20/08/2019 09:15    09:00   17:00   0 Days 07:50:00
2   21/08/2019 06:09    21/08/2019 08:19    09:00   17:00   0 Days 00:00:00
2   16/08/2019 03:03    17/08/2019 10:07    09:00   17:00   0 Days 00:01:07

我自己的尝试是通过一系列逻辑语句来查看我是否应该手动更改开始时间或结束时间,但是很快变得冗长,冗长,我想知道是否有人有更好的方法。

1 个答案:

答案 0 :(得分:1)

首先,我们计算开始时间与开始时间的关闭时间之间的差,并将其限制在0和最大开放时间跨度之间。然后,开放时间与结束日期的结束时间之间的差,也将其限制为0 ...开放时间跨度。最后,我们需要添加所有中间天的完全开放时间的数量:

import pandas as pd

pd.options.display.width = 200
pd.options.display.max_columns = 10

df = pd.DataFrame({'site': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2}, 'start_time': {0: '22/08/2019 15:17', 1: '12/08/2019 03:30', 2: '19/08/2019 09:25', 3: '21/08/2019 06:09', 4: '16/08/2019 03:03'}, 'finish_time': {0: '23/08/2019 17:37', 1: '12/08/2019 08:30', 2: '20/08/2019 09:15', 3: '21/08/2019 08:19', 4: '17/08/2019 10:07'}, 'open_time': {0: '09:00', 1: '09:00', 2: '09:00', 3: '09:00', 4: '09:00'}, 'close_time': {0: '17:00', 1: '17:00', 2: '17:00', 3: '17:00', 4: '17:00'}, 'current_variance': {0: '1 days 02:20:00.000000000', 1: '0 days 05:00:00.000000000', 2: '0 days 23:50:00.000000000', 3: '0 days 02:10:00.000000000', 4: '1 days 07:04:00.000000000'}})

# open time span
delta = pd.to_datetime(df.close_time) - pd.to_datetime(df.open_time)

# actual delta on start day
delta_start = df.apply(lambda r: pd.Timestamp.combine(pd.to_datetime(r.start_time), pd.to_datetime(r.close_time).time()), 1) - pd.to_datetime(df.start_time)
delta_start = delta_start.where(delta_start > pd.Timedelta(0), pd.Timedelta(0))
delta_start = delta_start.where(delta_start < delta, delta)

# actual delta on finish day
delta_finish = pd.to_datetime(df.finish_time) - df.apply(lambda r: pd.Timestamp.combine(pd.to_datetime(r.finish_time), pd.to_datetime(r.open_time).time()), 1)
delta_finish = delta_finish.where(delta_finish > pd.Timedelta(0), pd.Timedelta(0))
delta_finish = delta_finish.where(delta_finish < delta, delta)

# sum of start, finish and in-between days
df['actual_variance'] = delta_start + ((pd.to_datetime(df.finish_time).dt.date - pd.to_datetime(df.start_time).dt.date).dt.days - 1) * delta + delta_finish

print(df)

结果:

   site        start_time       finish_time open_time close_time           current_variance actual_variance
0     1  22/08/2019 15:17  23/08/2019 17:37     09:00      17:00  1 days 02:20:00.000000000        09:43:00
1     1  12/08/2019 03:30  12/08/2019 08:30     09:00      17:00  0 days 05:00:00.000000000        00:00:00
2     1  19/08/2019 09:25  20/08/2019 09:15     09:00      17:00  0 days 23:50:00.000000000        07:50:00
3     2  21/08/2019 06:09  21/08/2019 08:19     09:00      17:00  0 days 02:10:00.000000000        00:00:00
4     2  16/08/2019 03:03  17/08/2019 10:07     09:00      17:00  1 days 07:04:00.000000000        09:07:00

(在您的预期输出中,您忘记了开始日期和结束日期之间的日差-例如第一行:我们在19/08/22上获得了1:43的时间,在19/08/23上又得到了8小时-因此将是9:43小时,而不是1:43小时)