gpt4 book ai didi

python - 在Python中是否有一种有效的方法来确定两个日期之间每个时间段的小时数?

转载 作者:太空宇宙 更新时间:2023-11-03 20:58:52 25 4
gpt4 key购买 nike

我编写了一些代码来确定两个日期时间之间每个时间段的小时数。我的代码非常大/复杂,而之前我预计它相对较短/简单。有人建议编写更短/更快/更好的代码来达到相同的结果吗?

逻辑

我想对两个日期时间之间每个时间段的小时数进行求和,称为开始结束。它们可能相隔数天,也可能在同一小时内发生,但绝不会相同。时间段是预先定义的,并且工作日和周末的时间段不同。 开始结束的时间不必等于时隙的开始或结束时间。

工作日有 5 个时段,大小不同,分别是:

  • 时段 1:00:00 - 05:00
  • 时段 2:05:00 - 10:00
  • 时段 3:10:00 - 14:00
  • 时段 4:14:00 - 20:00
  • 时段 5:20:00 - 24:00

周末有 3 个时段,大小不同,分别是:

  • 时段 1:00:00 - 08:00
  • 时段 2:08:00 - 19:00
  • 时段 3:19:00 - 24:00

所需的结果

当我输入以下开始和结束日期时间时,

  • 开始 = 2019 年 4 月 1 日 12:00
  • 结束 = 2019 年 4 月 10 日 14:00

我期望得到以下结果:

  • time_slot_week_day_1 = 35
  • time_slot_week_day_2 = 35
  • time_slot_week_day_3 = 30
  • time_slot_week_day_4 = 42
  • time_slot_week_day_5 = 28
  • time_slot_weekend_day_1 = 16
  • time_slot_weekend_day_2 = 22
  • time_slot_weekend_day_3 = 10

到目前为止我的代码

class MyDateRange:
def __init__(self, name, start_datetime, end_datetime):
self.name = name
self.start_datetime = start_datetime
self.end_datetime = end_datetime


def hours_per_timeslot(date_range):
# time-slots week days
time_slots_week = {
1: {"begin": datetime.time(hour=0), "end": datetime.time(hour=5), "diff": datetime.timedelta(hours=5)},
2: {"begin": datetime.time(hour=5), "end": datetime.time(hour=10), "diff": datetime.timedelta(hours=5)},
3: {"begin": datetime.time(hour=10), "end": datetime.time(hour=14), "diff": datetime.timedelta(hours=4)},
4: {"begin": datetime.time(hour=14), "end": datetime.time(hour=20), "diff": datetime.timedelta(hours=6)},
5: {"begin": datetime.time(hour=20), "end": datetime.time(hour=23, minute=59, second=59, microsecond=999999),
"diff": datetime.timedelta(hours=4)}
}

# time-slots weekend days
time_slots_weekend = {
1: {"begin": datetime.time(hour=0), "end": datetime.time(hour=8), "diff": datetime.timedelta(hours=8)},
2: {"begin": datetime.time(hour=8), "end": datetime.time(hour=19), "diff": datetime.timedelta(hours=11)},
3: {"begin": datetime.time(hour=19), "end": datetime.time(hour=23, minute=59, second=59, microsecond=999999),
"diff": datetime.timedelta(hours=5)}
}

# dictionary to store outcome of week days
dict_week = {
1: datetime.timedelta(),
2: datetime.timedelta(),
3: datetime.timedelta(),
4: datetime.timedelta(),
5: datetime.timedelta(),
}

# dictionary to store outcome of weekend days
dict_weekend = {
1: datetime.timedelta(),
2: datetime.timedelta(),
3: datetime.timedelta(),
}

begin = date_range.start_datetime
end = date_range.end_datetime
delta = end - begin

# calculate the hours per time-slot when begin and en are on the same date.
if begin.date() == end.date():
day = calendar.day_name[begin.weekday()]
# in case it is weekend.
if day in ["Saturday", "Sunday"]:
for k, v in time_slots_weekend.items():
# in case begin and end are in the same time-slot
if v["begin"] <= begin.time() < v["end"] and v["begin"] <= end.time() < v["end"]:
dict_weekend[k] = end - begin
# in case they are not in the same time-slot
elif v["begin"] <= begin.time() < v["end"]:
dict_weekend[k] = datetime.datetime.combine(begin.date(), v["end"]) - begin
while True:
k += 1
v = time_slots_weekend[k]
if v["begin"] <= end.time() < v["end"]:
dict_weekend[k] = end - datetime.datetime.combine(end.date(), v["begin"])
break
else:
dict_weekend[k] = time_slots_week[k]["diff"]

# in case it is week.
else:
for k, v in time_slots_week.items():
if v["begin"] <= begin.time() < v["end"] and v["begin"] <= end.time() < v["end"]:
dict_week[k] = end - begin
elif v["begin"] <= begin.time() < v["end"]:
dict_week[k] = datetime.datetime.combine(begin.date(), v["end"]) - begin
while True:
k += 1
v = time_slots_week[k]
if v["begin"] <= end.time() < v["end"]:
dict_week[k] = end - datetime.datetime.combine(end.date(), v["begin"])
break
else:
dict_week[k] = time_slots_week[k]["diff"]

# calculate the hours per time-slot when begin and end are on different date.
else:
# calculate the hours per time-slot for begin time until end of day
day_begin = calendar.day_name[begin.weekday()]
# in case it is weekend.
if day_begin in ["Saturday", "Sunday"]:
for k, v in time_slots_weekend.items():
if v["begin"] <= end.time() < v["end"]:
dict_weekend[k] += (datetime.datetime.combine(begin.date(), v["end"])-begin)
k += 1
while k <= 3:
dict_weekend[k] += time_slots_weekend[k]["diff"]
k += 1
# in case it is week.
else:
for k, v in time_slots_week.items():
if v["begin"] <= end.time() < v["end"]:
dict_week[k] += datetime.datetime.combine(begin.date(), v["end"]) - begin
k += 1
while k <= 5:
dict_week[k] += time_slots_week[k]["diff"]
k += 1

# calculate the hours per time-slot for beginning of day until end time
day_end = calendar.day_name[end.weekday()]
# in case it is weekend.
if day_end in ["Saturday", "Sunday"]:
for k, v in time_slots_weekend.items():
if v["begin"] <= end.time() < v["end"]:
dict_weekend[k] += end - datetime.datetime.combine(end.date(), v["begin"])
k -= 1
while k > 0:
dict_weekend[k] += time_slots_weekend[k]["diff"]
k -= 1
# in case it is week.
else:
for k, v in time_slots_week.items():
if v["begin"] <= end.time() < v["end"]:
dict_week[k] += end - datetime.datetime.combine(end.date(), v["begin"])
k -= 1
while k > 0:
dict_week[k] += time_slots_week[k]["diff"]
k -= 1

# in case there are days between begin and end,
if delta.days > 1:
counted_days = {}
for i in range(delta.days-1):
day = calendar.day_name[(begin + datetime.timedelta(days=i + 1)).weekday()]
counted_days[day] = counted_days[day] + 1 if day in counted_days else 1
for k1, v1 in counted_days.items():
if k1 in ["Saturday", "Sunday"]:
for k2 in dict_weekend.keys():
dict_weekend[k2] += (time_slots_weekend[k2]["diff"] * v1)
else:
for k2 in dict_week.keys():
dict_week[k2] += (time_slots_week[k2]["diff"] * v1)

# put the results together and convert them into hours.
results = {}
for k, v in dict_week.items():
results["time_slot_week_day_"+str(k)] = v.seconds/60/60

for k, v in dict_weekend.items():
results["time_slot_weekend_day_"+str(k)] = v.seconds/60/60

return results


dr = MyDateRange("test", datetime.datetime(year=2019, month=4, day=21, hour=8), datetime.datetime(year=2019, month=4, day=27, hour=15))
print(hours_per_timeslot(dr))

最佳答案

使用时间、日期时间模块?计算秒然后将其转换回来,不是吗?或者我错过了你不想使用这个的原因?

from datetime import datetime, time
def date_diff_in_Seconds(dt2, dt1):
timedelta = dt2 - dt1
return timedelta.days * 24 * 3600 + timedelta.seconds
#Specified date
date1 = datetime.strptime('2018-01-01 01:00:00', '%Y-%m-%d %H:%M:%S')
#Current date
date2 = datetime.now()
print("\n%d seconds" %(date_diff_in_Seconds(date2, date1)))
print()

关于python - 在Python中是否有一种有效的方法来确定两个日期之间每个时间段的小时数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55830456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com