两个约会时间之间有多少“高级”小时?

2024-04-25 12:09:35 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我们面临的一个更大问题的一部分,但目前的问题是,根据这些时间在一天中的时间,将两个日期时间的时间分割成两个速率。这是相当武断的,但我们把早上7点到晚上7点视为正常时间,相反的12小时视为额外时间。你知道吗

所以对于任何给定的一对日期时间,我们都需要对它们进行分级,这样我们就可以知道在这段时间里有多少正常的小时,或者有多少额外的小时。举几个例子:

如果我们用接下来的24小时,我会预计12小时的确切时间。你知道吗

> start = datetime.datetime.now()
> end = start + datetime.timedelta(1)
> split_hours(start, end)
(datetime.timedelta(0, 43200), datetime.timedelta(0, 43200))

如果我们在接下来的12个小时,20:26,我预计1小时26分正常,10小时34分保险费率:

> start = datetime.datetime(2017, 11, 6, 20, 26, 0)
> end = start + datetime.timedelta(hours=12)
> split_hours(start, end) 
(datetime.timedelta(0, 5160), datetime.timedelta(0, 38040))

“我该怎么做?”这是我的问题。对不起的。我一天中大部分时间都在思考这个问题,但只涉及到以下餐巾纸算法:

  • 将范围拆分为不同的日期时间范围(如何?!)对于每个:
    • 将早上7点之前和晚上7点之后的小时计算为保险费
    • 计算早上7点到晚上7点之间的小时数
  • 把它们加起来。你知道吗

但即使在那里我也不知道如何把事情分开。你知道吗

还有一个很自然的扩展——我几乎肯定会在某个时候实现这个扩展——它也将周末的工作时间划分为高级。如果我可以分割时间(就像我的餐巾纸算法一样),那就很容易理解了,但我还是不喜欢那个“代码”有多笨拙。如果你的回答也涵盖了这一点,你可以生我的长子。嗯,不,你可以得到赏金什么的。你知道吗

我在Python中这样做,没有任何真正的库限制(如果有)™ 但是如果你想提交一个原始的C或伪代码的答案,我相信我能读懂它。你知道吗


Tags: 代码算法datetime速率时间startnow例子
2条回答

我们可以:

  1. 在开始和结束之间生成日期时间范围
  2. 循环该范围并计算正常秒数(长度-normal=premium)

代码如下:

import datetime

def split_hours(start, end):

    # Total seconds
    length = int((end-start).total_seconds())

    # Generator with datetime objects
    s = (start + datetime.timedelta(seconds=i) for i in range(length))

    # Calculate normal and premium
    # normal when hour > 7 AM, smaller than 7 PM and weekday not sat,sun
    normal = sum(7 <= i.hour < 19 and i.weekday() not in [5,6] for i in s)
    premium = length - normal

    d = dict(normal=normal,
             premium=premium,
             total=dict(h=length/3600,m=length/60,s=length))

    return d

现在我们可以做一些测试:

start = datetime.datetime.now()
end1 = start + datetime.timedelta(hours=12)
end2 = start + datetime.timedelta(days=1)
end3 = start + datetime.timedelta(days=24)

print(split_hours(start,end1))
print(split_hours(start,end2))
print(split_hours(start,end3))

退货:

# 12 hours
{'total': {'h': 12.0, 's': 43200, 'm': 720.0}, 'premium': 26131, 'normal': 17069}

# 1 days / 24 hours
{'total': {'h': 24.0, 's': 86400, 'm': 1440.0}, 'premium': 43200, 'normal': 43200}

# 7 days
{'total': {'h': 168.0, 's': 604800, 'm': 10080.0}, 'premium': 388800, 'normal': 216000}

这就是我的方法:

from datetime import datetime, timedelta


def is_premium_time_period(start_time, end_time):

    start_time = datetime.strptime(start_time, "%d-%m-%Y %H:%M")
    end_time = datetime.strptime(end_time, "%d-%m-%Y %H:%M")

    seconds = (end_time - start_time).total_seconds()
    minutes = int(seconds / 60)

    premium_minutes = 0
    regular_minutes = 0

    for minute in range(minutes):

        premium_start = datetime.strptime("19:00 {}".format(start_time.date()), "%H:%M %Y-%m-%d")
        premium_end = premium_start + timedelta(hours=12)

        previous_start = premium_start - timedelta(hours=24)
        previous_end = previous_start + timedelta(hours=12)

        if premium_start <= start_time < premium_end or previous_start <= start_time < previous_end:
            premium_minutes += 1
        else:
            regular_minutes += 1
        start_time += timedelta(minutes=1)

    _premium_hours = premium_minutes / 60
    _regular_hours = regular_minutes / 60

    return _premium_hours, _regular_hours


datetime_01 = "06-11-2017 14:17"
datetime_02 = "06-11-2017 19:20"

datetime_03 = "05-11-2017 02:39"
datetime_04 = "11-11-2017 08:39"


print(is_premium_time_period(datetime_01, datetime_02))
print(is_premium_time_period(datetime_03, datetime_04))

编辑:很抱歉,我忘了发布它返回的内容: 它返回:

(0.3333333333333333, 4.716666666666667)
(76.35, 73.65)

含义(高级工作时间、常规工作时间)

相关问题 更多 >