帮老婆系列-关于计算Excel表去除指定时间段后的时间差

帮老婆系列-关于计算Excel表去除指定时间段后的时间差,第1张

老婆给了个小小的任务,说是把工单的有效流转时长给计算出来,工单的有效流转时长=工单的开始时间-工单的结束时间-非工作时间段,看起来很简单的一件事情,耗费了我好几个小时,又用了个把小时用python实现了一遍。

首先数据是Excel表,自然首先想到的是Excel函数,Excel函数的缺点是日期计算和时间计算是分开的,想了一下还是从网络上找一些现成的公式吧,找了十几个公式,测试了半天,发现都多少有些问题,还是自己开撸吧。

Excel计算时间差的几个步骤

1、将date和time进行分割

2、将time进行标准化,如果时间在指定时间段之内,用该时间,否则取大或取小,突然想起来,还是可以持续优化的。

3、计算标准化的time时间差,多出来的天数才算天数

4、计算date日期差

5、将日期差*12小时+时间差=有效工作时间

python实现的方式和excel如出一辙,看一下excel处理步骤,python也是一样的。

吐槽一下,python对datetime时间的支持不敢恭维。

import datetime

format = '%Y-%m-%d %H:%M:%S'
excludestart='08:00:00'
excludeend='20:00:00'
startdts=["2022-03-06 01:52:51","2022-03-06 01:52:51","2022-03-06 01:52:51","2022-03-06 01:52:51","2022-03-06 01:52:51","2022-03-06 01:52:51"]
enddts=["2022-03-06 03:52:51","2022-03-06 10:52:51","2022-03-06 21:52:51","2022-03-07 04:52:51","2022-03-07 12:52:51","2022-03-07 20:52:51"]

def returndate(curtimestr):
    if curtimestrexcludeend:
        curtimestr=excludeend
    return curtimestr

for i in range(len(startdts)):
    start=datetime.datetime.strptime(startdts[i],format)
    end = datetime.datetime.strptime(enddts[i], format)
    print('------------compute the timediff between {} and {}---------------'.format(start,end))
    startdatestr=startdts[i][0:10]
    startimestr=startdts[i][11:19]
    enddatestr = enddts[i][0:10]
    endtimestr = enddts[i][11:19]
    print('before format ',startimestr,'~',endtimestr)
    startimestr=returndate(startimestr)
    endtimestr=returndate(endtimestr)
    print('after format ',startimestr,'~',endtimestr)
    startday=start.date()
    endday=end.date()
    datedif=(endday - startday).days * 24
    print('日期差小时数=',datedif)
    starttime= datetime.datetime.strptime(startimestr, "%H:%M:%S")
    endtime=datetime.datetime.strptime(endtimestr, "%H:%M:%S")
    print(starttime,type(starttime))
    timedif=((endtime- starttime).seconds)/60/60.0
    print('时间差小时数=',timedif,type(timedif))
    totaldif=datedif+timedif
    print('总时间差小时数=',totaldif)

运行结果输出如下

# ------------compute the timediff between 2022-03-06 01:52:51 and 2022-03-06 03:52:51---------------
# before format  01:52:51 ~ 03:52:51
# after format  08:00:00 ~ 08:00:00
# 日期差小时数= 0
# 1900-01-01 08:00:00 
# 时间差小时数= 0.0 
# 总时间差小时数= 0.0
# ------------compute the timediff between 2022-03-06 01:52:51 and 2022-03-06 10:52:51---------------
# before format  01:52:51 ~ 10:52:51
# after format  08:00:00 ~ 10:52:51
# 日期差小时数= 0
# 1900-01-01 08:00:00 
# 时间差小时数= 2.8808333333333334 
# 总时间差小时数= 2.8808333333333334
# ------------compute the timediff between 2022-03-06 01:52:51 and 2022-03-06 21:52:51---------------
# before format  01:52:51 ~ 21:52:51
# after format  08:00:00 ~ 20:00:00
# 日期差小时数= 0
# 1900-01-01 08:00:00 
# 时间差小时数= 12.0 
# 总时间差小时数= 12.0
# ------------compute the timediff between 2022-03-06 01:52:51 and 2022-03-07 04:52:51---------------
# before format  01:52:51 ~ 04:52:51
# after format  08:00:00 ~ 08:00:00
# 日期差小时数= 24
# 1900-01-01 08:00:00 
# 时间差小时数= 0.0 
# 总时间差小时数= 24.0
# ------------compute the timediff between 2022-03-06 01:52:51 and 2022-03-07 12:52:51---------------
# before format  01:52:51 ~ 12:52:51
# after format  08:00:00 ~ 12:52:51
# 日期差小时数= 24
# 1900-01-01 08:00:00 
# 时间差小时数= 4.880833333333333 
# 总时间差小时数= 28.880833333333335
# ------------compute the timediff between 2022-03-06 01:52:51 and 2022-03-07 20:52:51---------------
# before format  01:52:51 ~ 20:52:51
# after format  08:00:00 ~ 20:00:00
# 日期差小时数= 24
# 1900-01-01 08:00:00 
# 时间差小时数= 12.0 
# 总时间差小时数= 36.0

最后,谢谢关注,谢谢支持!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/759586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-01
下一篇 2022-05-01

发表评论

登录后才能评论

评论列表(0条)

保存