日期时间之间有多少“高级”时间?

时间:2017-11-06 21:00:57

标签: python datetime

这是我们面临的更大问题的一部分,但目前的问题是将两个日期时间之间的时间分成两个基于的时间那些小时数。这是相当随意的,但我们将早上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中这样做没有任何真正的库限制(例如Pandas Just Does™这个)但如果你想提交原始C或伪代码答案,我相信我能够阅读它

2 个答案:

答案 0 :(得分:1)

我们可以:

  1. 生成开始和结束之间的日期时间范围
  2. 循环该范围并计算正常秒数(长度 - 正常=高级)
  3. 以下是代码:

    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}
    

答案 1 :(得分:1)

这将是我的方法:

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)

意义(premium_hours,regular_hours)