时间A: 2019-01-05 14:30:00 (周六)
时间B: 2019-01-07 15:20:00 (周一)
实际时间差: 时间B - 时间A = 2 天 0 小时 50 分钟 0 秒
而计算工作时间内的时间差则是: 时间B - 时间A = 8 小时 50 分钟 0 秒
这个时间的计算规则是:
1. 定义一天工作八小时,8:00-12:00 13:00-17:00
2. 周一至周六属工作日
3. 剔除非工作日时间(周日,节假日)
所以在这里剔除一月六号是周日后 时间B-时间A应该等于:1工作日0小时50分钟0秒
而1工作日=8小时
所以有如上得出的时间差。
import pandas as pd
import datetime
import json
import requests
def judgedate(datenum):
url='http://api.goseek.cn/Tools/holiday?date={}'.format(datenum)
html = requests.get(url=url).content
data = json.loads(html.decode('utf-8'))
value=data['data']
return value
返回数据:正常工作日对应结果为 0, 法定节假日对应结果为 1, 节假日调休补班对应的结果为 2,休息日对应结果为 3¶
def weekend(day):
weekday = datetime.datetime.strptime(day, '%Y%m%d').weekday()
if weekday==5:
return True
else:
return False
判断是否是周六
def getnum(datenum):
date = datetime.datetime.strptime(datenum,"%Y%m%d")
num=date.timetuple().tm_yday
return num
得到一个日期是一年中的第多少天
def getBetweenDay(begin_date,end_date):
date_list = []
begin_date = datetime.datetime.strptime(begin_date, "%Y%m%d")
end_date = datetime.datetime.strptime(end_date, "%Y%m%d")
while begin_date <= end_date:
date_str = begin_date.strftime("%Y%m%d")
date_list.append(date_str)
begin_date += datetime.timedelta(days=1)
return date_list
遍历输出两个日期之间的日期,输出格式为‘20190101’
def get_date_match_list():
date_list=getBetweenDay('20190101','20191231')
num_list=[]
match_list=[]
remark_list=[]
day=0
for date in date_list:
print(date)
num=getnum(date)
match=num
value=judgedate(date)
remark=''
if value==0:
match=match-day
remark='工作日'
elif value==1:
day+=1
match=0
remark='法定节假日'
elif value==2:
match=match-day
remark='调休工作日'
elif value==3:
is_saturday=weekend(date)
if is_saturday:
match=match-day
remark='周六加班'
else:
day+=1
match=0
remark='周日休息'
num_list.append(num)
match_list.append(match)
remark_list.append(remark)
date_match_list=pd.DataFrame({'date':date_list,'num':num_list,'match':match_list,'remark':remark_list})
return date_match_list
num : 该日期在一年中的实际第多少天 match : 扣除后的第多少天
date_match_list=get_date_match_list()
date_match_list.to_csv('date_match.csv')
dataset写入csv
GitHub完整项目
如果有更简单的方法请告诉我哦,这里是小shin,欢迎指点,谢谢。