2011-06-27 5 views
0

私はイベントのリストを持っています。両方のdatetimeオブジェクトであるStartおよびEndとしての各イベント。私は現在、表示の目的で、既存のイベントから作成された「空き時間」イベントのリストを必要としています。私はそれが理にかなったことを願うこれはこれまで私が思いつくことができる最高です。どんな助けにも感謝!python datetimeオブジェクトのリストで 'スペア'時間を見つける

class Event(): 
    Start = datetime.datetime 
    End = datetime.datetime 
    Reserved = boolean 

# create a couple of events with some spare time between them... 

ev1 = Event() 
ev1.Start = datetime.datetime(2011,1,1,5) 
ev1.End = datetime.datetime(2011,1,1,6) 
ev1.Reserved = True 

ev2 = Event() 
ev2.Start = datetime.datetime(2011,1,1,8) 
ev2.End = datetime.datetime(2011,1,1,9) 
ev2.Reserved = True 

events = [ev1,ev2] 

# sort the events list... 

events.sort(key=lambda e: e.Start) 

# create a 'spare time' event based on the existing events... 

allevents = [] 

for event in events: 
    spare = Event() 
    spare.Start = events[events.index(event)-1].End+datetime.timedelta(seconds=1) 
    spare.End = event.Start-datetime.timedelta(seconds=1) 
    spare.Reserved = False 
    allevents.append(spare) 
    allevents.append(event) 

allevents.sort(key=lambda e: e.Start) 

for event in allevents: 
    print str(event.Start), str(event.End), event.Reserved 

ので、これは動作しますが、私は停止し、深夜の空いた時間を開始する方法を把握するためには至っていないが、私はそれを行う前に、私は私が正しい方向に向かってるかどうかを知りたいです皮切りに。それとももっと良い方法がありますか? (通常はあります!)..

MFB

+0

-1(Eventクラスの奇妙な定義の場合) __init __()のようなコンストラクタを使うのが聞こえますか?これらの無意味な割り当てdatetime.datetimeは何をすべきですか? –

+0

コードに角括弧がありません。 – mac

+0

@mac - ありがとうございます。 @センチネル - はい、私は多くのことを学ぶ必要があります。実のところ、私の実際のアプリでは、イベントはエリクシルクラスとして宣言されています。 Pythonクラスを作成する必要はほとんどありません。私はちょうど今度はあなたのような人々がすぐにコードを実行できるようにしました。だから、あなたが洞察力を持っていれば、投稿の主題は、素晴らしい! – MFB

答えて

1

私はもっとこのようにそれを行うだろう - ちょうど(それはより多くのエラー処理が必要ですが、今のところ、それはちょうど考えを示すべきである)あなたにいくつかのより多くの概念を与えるために:

from datetime import datetime 
class Venue(object): 
    """Collection of events""" 
    def __init__(self): 
     self.events_list = [] 

    def add_events(self,*args): 
     for e in args: 
      self.events_list.append(e) 

    def sort_list(self): 
     self.events_list.sort(key=lambda e: e.start_date) 

    def find_spare_times(self): 
     self.sort_list() 
     for event in self.events_list: 
      yield event.start_date 
      yield event.end_date 

    def add_spare_events(self): 
     l = list(self.find_spare_times()) 
     print l 
     new_start,new_end = None, None 
     for e in l[1:]: 
      if new_start: 
       new_end = e 
       self.add_events(Event(new_start,new_end,res=False)) 
       new_start = None 
      else: 
       new_start = e 
       new_end = None 

    def get_events(self): 
     return self.events_list 

class Event(object): 
    """Holds the data for an individual event""" 
    def __init__(self,start_date, end_date,res=True): 
     self.start_date = start_date 
     self.end_date = end_date 
     self.reserved = res 

# create a couple of events with some spare time between them... 
def main(): 
    ev1 = Event(datetime(2011,1,1,5),datetime(2011,1,1,6)) 
    ev2 = Event(datetime(2011,1,1,8),datetime(2011,1,1,9)) 

    v = Venue() 
    v.add_events(ev1,ev2) 
    print v.get_events() 
    v.add_spare_events() 
    print v.get_events() 

if __name__ == "__main__": 
    main() 
+0

ありがとうございます。これは非常に異なり、私はそれから多くを学びました。私の例のように1秒増分を得るためには拡張が必要ですが、あなたは私の心を開いています!乾杯。 – MFB

関連する問題