2

2 つの日付の間で、イベントがアクティブである正確な秒数を計算する必要があります。ただし、イベントには追加の制約がある場合があります。特定の時間枠や曜日でのみアクティブになる場合があります。

rrule を frequencyrrule.SECONDLYで使用してみましたが、関数の実行には 2 ~ 3 秒かかります。私はrrule.HOURLY3600を掛けて使用しました。

以下のようなシステムを実装したのですが、例では終了日の16時から28分、開始日の16時から10分がカウントされない欠点があります。

例:

from datetime import datetime
from dateutil import rrule

time_slot = {'start': "173000", 'end': "180000"}
start_date = datetime(2015, 3, 5, 16, 50)
end_date = datetime(2015, 3, 27, 16, 28)

start_hour = int(time_slot.get('start', '000000')[0:2])
end_hour = int(time_slot.get('end', '235959')[0:2])
start_minute = int(time_slot.get('start', '000000')[2:4])
end_minute = int(time_slot.get('end', '235959')[2:4])
time_slot_hours = []
time_slot_minutes = []

if start_minute:
    time_slot_minutes.append({'hour': start_hour, 'minutes': [m for m in range(start_minute, 60)]})
    start_hour += 1

if end_minute:
    time_slot_minutes.append({'hour': end_hour, 'minutes': [m for m in range(0, end_minute)]})

for hour in range(start_hour, end_hour):
    time_slot_hours.append(hour)

active_seconds = 60 * 60 * len(list(rrule.rrule(rrule.HOURLY, byhour=time_slot_hours, dtstart=start, until=end)))
for m in time_slot_minutes:
    active_seconds += 60 * len(list(rrule.rrule(rrule.MINUTELY, byminute=m['minutes'], byhour=m['hour'], dtstart=start, until=end)))

この問題を解決するよりエレガントな方法はありますか?

4

0 に答える 0