python 获取一年中所有工作日列表来辅助计算工作时间内的时间差

python 获取一年中所有工作日列表来辅助计算工作时间内的时间差


扣除一年365天(时间区间可自定义)中的节假日和周日休息日,得到工作日列表dataset,方便计算工作日与工作日之间的工作时间差。

思路来源

时间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,欢迎指点,谢谢。

猜你喜欢

转载自blog.csdn.net/q1042960848/article/details/98741625