python计算两个日期间的工作日天数

df['总天数']=(pd.to_datetime(df['完成时间'])-pd.to_datetime(df['创建时间'])).dt.ceil('d')

计算的数据背景:计算得到处理一个工单的工作日天数 

计算公式:总工作天数 - 休息天数(周末+节假日)

一、计算总天数

python中计算完成一件事情的时间范围,得到一个日期差,并且向上取整,计算得到天数 比如 1days

这个时候计算得到的字段总天数 数据类型为  datetime64[n]

二、计算休息天数

start_date 为工单的创建时间

end_date为工单的完成时间

休息天数初始值设置为0

week_day 为导入python中的一个文件,为全部的休息日(周末+节假日)

# 休息天数计算
def count_weekend_days(start_date, end_date):
    start_date = datetime.strptime(start_date, "%Y-%m-%d")
    end_date = datetime.strptime(end_date, "%Y-%m-%d")
    weekend_days = 0
    while start_date <= end_date:
        if start_date in week_day:
            weekend_days += 1
        start_date += timedelta(days=1) 

    return weekend_days

  计算休息天数:

for m in df.index:
    if df['完成时间'][m] is not np.nan :
        df.at[m,'休息天数']=count_weekend_days(df['创建时间'][m].split(' ')[0],df['完成时间'][m].split(' ')[0])

    创建时间和完成时间的格式为“2024-01-01 18:20:30" ,此处直接给时间做了切分,取年月日,并做减法,得到的值为float类型

三、计算工作日天数

工作日天数 = 总天数 - 休息天数

此时总天数数据类型为datetime64[n],休息天数数据类型为 float,无法直接计算

而且时间差的数据类型和时间类型不一样,时间类型可以强制转换为字符串,但是时间差的数据类型不可以

python 中两个日期计算的差值转换为str

故:时间差的数据类型----转化为时间类型----转换为字符串---转化为数值

# 完成时间有可能有空值,这样会导致计算得到的总天数有空值,数据类型转换前需将空值部分填充为0 days
df['总天数'].fillna(pd.Timedelta(seconds=0),inplace=True)

for n in df.index:
    df.at[n, '总天数date'] = (pd.Timestamp('2023-01-01') + df.at[n, '总天数']).strftime('%Y-%m-%d') # 将总天数+ 一个固定的时间→转化为日期格式
    df.at[n,'总月'] = int(df.at[n, '总天数date'].split('-')[1])#一月的最大天数为31,为避免有的时间差大于31天,故截取月作为验证,如果月>1,那么部分数据需手动调整(此处根据业务实际情况)
    df.at[n,'总日'] = int(df.at[n, '总天数date'].split('-')[2])-1# 得到的天数


for i in df.index:
    if df.at[i,'总月']== 1:
        df.at[i,'工作日天数'] = df.at[i,'总日'] - df.at[i,'休息天数']

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值