亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

給定許多“開始”和“結束”日期時間對象,如何找到間隙?

給定許多“開始”和“結束”日期時間對象,如何找到間隙?

揚帆大魚 2021-11-09 20:36:57
我有成對的 DateTime 對象。每個 DateTime 對象都是時間范圍的“開始”或“結束”。時間范圍有時會重疊。我需要找到差距。我在 pypi 上嘗試了 DateTimeRange 模塊,測試相交范圍,然后構建包含的范圍(根據他們的文檔),但我無法將這些組件構建到一段代碼中來做我想要的編輯:在這種情況下,“間隔”被定義為最早的“開始”和最新的“結束”之間的任何時間段,該時間段不包含在“開始”和“結束”DateTime 對象對中import dateparserfrom pprint import pprintfoo = []foo.append({    "start": dateparser.parse("8:00 AM"),    "end": dateparser.parse("8:06 AM")})foo.append({    "start": dateparser.parse("8:03 AM"),    "end": dateparser.parse("8:07 AM")})foo.append({    "start": dateparser.parse("8:02 AM"),    "end": dateparser.parse("8:16 AM")})foo.append({    "start": dateparser.parse("8:20 AM"),    "end": dateparser.parse("8:30 AM")})pprint(foo)#[{'end': datetime.datetime(2019, 2, 15, 8, 6),#  'start': datetime.datetime(2019, 2, 15, 8, 0)},# {'end': datetime.datetime(2019, 2, 15, 8, 7),#  'start': datetime.datetime(2019, 2, 15, 8, 3)},# {'end': datetime.datetime(2019, 2, 15, 8, 16),#  'start': datetime.datetime(2019, 2, 15, 8, 2)},# {'end': datetime.datetime(2019, 2, 15, 8, 30),#  'start': datetime.datetime(2019, 2, 15, 8, 20)}]find_gaps(foo)#desired output##[{'end': datetime.datetime(2019, 2, 15, 8, 20),#  'start': datetime.datetime(2019, 2, 15, 8, 16)}]
查看完整描述

1 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

您可以根據開始時間對范圍進行排序,然后跟蹤結束時間,直到找到結束時間和下一個開始時間之間的差距。如果你發現這個差距,你就追加它。如果下一個結束時間大于當前結束時間,則需要提前結束時間。


def find_gaps(ranges):

    if len(ranges) <= 1:

        return []


    # sort by start times

    ranges = sorted(ranges, key=lambda x:x['start'])


    gaps = []


    # Start at the end of the first range

    now = ranges[0]['end']


    # Iterate through ranges, ignoring the first range

    for pair in ranges[1:]:

        # if next start time is before current end time, keep going until we find a gap

        # if next start time is after current end time, found the first gap

        if pair['start'] > now:

            gaps.append({

                'start':now,

                'end':pair['start']

                })

        # need to advance "now" only if the next end time is past the current end time

        now = max(pair['end'], now)

    return gaps

輸出:


[{'end': datetime.datetime(2019, 2, 15, 8, 20),

  'start': datetime.datetime(2019, 2, 15, 8, 16)}]


查看完整回答
反對 回復 2021-11-09
  • 1 回答
  • 0 關注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號