【问题标题】:Differance between two days excluding weekends in hours两个日期之间的差异,不包括周末的小时数
【发布时间】:2019-12-10 18:02:57
【问题描述】:

我有一个使用 np.busdaycount 计算不包括周末的日期差异的代码,但我需要它在我无法获得的时间。

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

我需要输出时间,不包括周末。喜欢

  Hours
0  254

问题

inflow_date_time=2019-08-01 23:22:46 End_date_time = 2019-08-05 17:43:51 预计小时数 42 小时 (1+24+17)

inflow_date_time=2019-08-03 23:22:46 End_date_time = 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 预计小时数 17 小时 (0+0+17)

流入日期时间=2019-07-26 23:22:46 End_date_time = 2019-08-05 17:43:51
预计小时数 138 小时 (1+120+17)

inflow_date_time=2019-08-05 11:22:46 End_date_time = 2019-08-05 17:43:51
预计小时数 6 小时 (0+0+6)

请提出建议。

【问题讨论】:

  • 为什么不能乘以一天的小时数?
  • 我需要准确的时间,所以我无法乘以得到完整的答案

标签: python pandas dataframe timestamp timedelta


【解决方案1】:

如果我没有完全错,您也可以使用更短的解决方法:

首先将您的天差保存在一个数组中:

res = np.busday_count(df['Inflow_date_time'].values.astype('datetime64[D]'), df['End_date_time'].values.astype('datetime64[D]'))

那么我们需要为每一行增加一个小时列:

df['starth'] = df['Inflow_date_time'].dt.hour
df['endh'] = df['End_date_time'].dt.hour

然后我们将为您的数据框获取日差:

my_list = res.tolist()
dfhelp =pd.DataFrame(my_list,columns=['col1'])
df2 = pd.concat((df, df2) , axis=1)

那我们得找个帮助栏,因为End_date_time的小时可以在Inflow_date-time之前:

df2['h'] = df2['endh']-df2['starth']

然后我们可以计算时差(一天有24小时,根据结束日期的时间是否早于开始时间日期):

df2['differenceh'] = np.where(df2['h'] >= 0, df2['col1']*24+df2['h'], df2['col1']*24-24+(24+df2['h']))

【讨论】:

    【解决方案2】:

    想法是按天删除times 的下限日期时间,并通过numpy.busday_count 获取开始日+一天到hours3 列之间的工作日数,然后创建hour1hour2 列作为开始如果不是周末时间,则以小时为单位结束时间。最后将所有小时列相加:

    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  
    

    【讨论】:

    • @Madan - 经过测试,我意识到31.7.2019 is Wednesday1.8.2019Thurstay,所以工作正常。我错误地测试了 31.81.9 而不是 31.71.8
    • @Madan - 已编辑,我希望现在是正确的 - 检查this
    • 您可以将所有有问题的日期时间添加到 df = pd.DataFrame(columns=['Inflow_date_time','End_date_time']) df.Inflow_date_time= [pd.Timestamp('2019-08-01 21:11:26'), pd.Timestamp('2019-07-22 21:11:26'), pd.Timestamp('2019-08-02 21:11:26')] df.End_date_time= [pd.Timestamp('2019-08-02 11:44:47')] * 3 吗?因为现在我失去了什么工作,什么不工作。
    • @Madan - 尝试解释更多。最好的办法是修改上面的数据框,添加所有有问题的日期时间,因为仍然不确定什么工作正确。
    • @Madan - 昨天没时间,我希望今天
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2012-08-22
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多