两天之间的差异(不包括周末,以小时为单位) [英] Differance between two days excluding weekends in hours

查看:74
本文介绍了两天之间的差异(不包括周末,以小时为单位)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个代码,可以使用np.busdaycount计算不包括周末的日期差异,但是我需要在我无法获得的小时数中输入.

I have a code that calculates the date differance excluding the weekends using np.busdaycount, but i need it in the hours which i cannot able to get.

import datetime
import numpy as np


df.Inflow_date_time= [pandas.Timestamp('2019-07-22 21:11:26')]
df.End_date_time= [pandas.Timestamp('2019-08-02 11:44:47')]

df['Day'] = ([np.busday_count(b,a) for a, b in zip(df['End_date_time'].values.astype('datetime64[D]'),df['Inflow_date_time'].values.astype('datetime64[D]'))])

  Day
0  9

除周末外,我的工作时间为小时.喜欢

I need the out put as hours excluding the weekend. Like

  Hours
0  254

问题

Inflow_date_time = 2019-08-01 23:22:46 结束日期时间= 2019-08-05 17:43:51 预期时间42小时 (1 + 24 + 17)

Inflow_date_time=2019-08-01 23:22:46 End_date_time = 2019-08-05 17:43:51 Hours expected 42 hours (1+24+17)

Inflow_date_time = 2019-08-03 23:22:46 结束日期时间= 2019-08-05 17:43:51
预计时间17小时 (0 + 0 + 17)

Inflow_date_time=2019-08-03 23:22:46 End_date_time = 2019-08-05 17:43:51
Hours expected 17 hours (0+0+17)

Inflow_date_time = 2019-08-01 23:22:46 结束日期时间= 2019-08-05 17:43:51 预计时间17小时 (0 + 0 + 17)

Inflow_date_time=2019-08-01 23:22:46 End_date_time = 2019-08-05 17:43:51 Hours expected 17 hours (0+0+17)

Inflow_date_time = 2019-07-26 23:22:46 结束日期时间= 2019-08-05 17:43:51
预计时间138小时 (1 + 120 + 17)

Inflow_date_time=2019-07-26 23:22:46 End_date_time = 2019-08-05 17:43:51
Hours expected 138 hours (1+120+17)

Inflow_date_time = 2019-08-05 11:22:46 结束日期时间= 2019-08-05 17:43:51
预期时间6小时 (0 + 0 + 6)

Inflow_date_time=2019-08-05 11:22:46 End_date_time = 2019-08-05 17:43:51
Hours expected 6 hours (0+0+6)

请提出建议.

推荐答案

想法是按日期逐层删除times的楼层日期时间,并通过hours3列获取开始日期+一日之间的营业日数. href ="https://docs.scipy.org/doc/numpy/reference/generated/numpy.busday_count.html" rel ="nofollow noreferrer"> numpy.busday_count ,然后创建hour1开始时间和结束时间列,如果不是周末,则以小时为单位.最后汇总所有小时数列:

Idea is floor datetimes for remove times by floor by days and get number of business days between start day + one day to hours3 column by numpy.busday_count and then create hour1 and hour2 columns for start and end hours with floor by hours if not weekends hours. Last sum all hours columns together:

df = pd.DataFrame(columns=['Inflow_date_time','End_date_time', 'need'])
df.Inflow_date_time= [pd.Timestamp('2019-08-01 23:22:46'),
                      pd.Timestamp('2019-08-03 23:22:46'),
                      pd.Timestamp('2019-08-01 23:22:46'),
                      pd.Timestamp('2019-07-26 23:22:46'),
                      pd.Timestamp('2019-08-05 11:22:46')]
df.End_date_time= [pd.Timestamp('2019-08-05 17:43:51')] * 5
df.need = [42,17,41,138,6]

#print (df)


df["hours1"] = df["Inflow_date_time"].dt.ceil('d')
df["hours2"] =  df["End_date_time"].dt.floor('d')
one_day_mask = df["Inflow_date_time"].dt.floor('d') == df["hours2"]

df['hours3'] = [np.busday_count(b,a)*24 for a, b in zip(df['hours2'].dt.strftime('%Y-%m-%d'),
                                                        df['hours1'].dt.strftime('%Y-%m-%d'))]

mask1 = df['hours1'].dt.dayofweek < 5
hours1 = df['hours1']  - df['Inflow_date_time'].dt.floor('H')

df['hours1'] = np.where(mask1, hours1, np.nan) / np.timedelta64(1 ,'h')

mask2 = df['hours2'].dt.dayofweek < 5

df['hours2'] = (np.where(mask2, df['End_date_time'].dt.floor('H')-df['hours2'], np.nan) / 
                np.timedelta64(1 ,'h'))

df['date_diff'] = df['hours1'].fillna(0) + df['hours2'].fillna(0) + df['hours3']

one_day = (df['End_date_time'].dt.floor('H') - df['Inflow_date_time'].dt.floor('H')) / 
            np.timedelta64(1 ,'h')
df["date_diff"] = df["date_diff"].mask(one_day_mask, one_day)


print (df)
     Inflow_date_time       End_date_time  need  hours1  hours2  hours3  \
0 2019-08-01 23:22:46 2019-08-05 17:43:51    42     1.0    17.0      24   
1 2019-08-03 23:22:46 2019-08-05 17:43:51    17     NaN    17.0       0   
2 2019-08-01 23:22:46 2019-08-05 17:43:51    41     1.0    17.0      24   
3 2019-07-26 23:22:46 2019-08-05 17:43:51   138     NaN    17.0     120   
4 2019-08-05 11:22:46 2019-08-05 17:43:51     6    13.0    17.0     -24   

   date_diff  
0       42.0  
1       17.0  
2       42.0  
3      137.0  
4        6.0  

这篇关于两天之间的差异(不包括周末,以小时为单位)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆