老婆给了个小小的任务,说是把工单的有效流转时长给计算出来,工单的有效流转时长=工单的开始时间-工单的结束时间-非工作时间段,看起来很简单的一件事情,耗费了我好几个小时,又用了个把小时用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
最后,谢谢关注,谢谢支持!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)