2010-12-10 11 views
2

Hey alle. Ich denke nicht, dass das sehr kompliziert sein sollte, aber ich verstehe es einfach nicht. Ich habe eine Liste von datetime Objekten, die an einem bestimmten Datum beginnen und bei eins enden. Einige Tage können übersprungen werden. Ich kann sie wie folgt ausdrucken:Benötigen Sie Python datetime magic

for entry in dates: 
    print entry 

die mir die folgende Ausgabe gibt:

2010-11-29 10:00:00.0 
2010-12-30 10:00:00.0 
2010-12-01 10:00:00.0 # Note that December 3rd has been skipped 
... 
2010-12-07 10:00:00.0 

Was möchte ich tun, ist, eine Ausgabe wie diese:

Day 1: ok 
Day 2: ok 
Day 3: skipped 
Day 4: ok 
... 
Day 10: ok 

Könnte mir hier jemand mit gesundem Menschenverstand helfen?

Danke!

+2

Ich denke, Ihr Beispiel Ausgang ein bisschen falsch ist. Es springt vom 29. November (11-29) bis zum 30. Dezember (12-30) und dann zurück zum 1. Dezember (12-01). Obwohl ich denke, wir verstehen, was du meinst! – Spacedman

Antwort

9

Hier ist eine Möglichkeit, dies zu tun, indem Sie Ihre datetime s in date s konvertieren. Anstatt zu versuchen, über die Daten selbst zu iterieren, nehmen wir eine timedelta des letzten Datums und des ersten Datums (das erfordert, dass Ihre Daten sortiert werden, fügte ich einen sorted Anruf hinzu, falls sie nicht sind). Dann sehen wir, wenn das erste Datum plus die Anzahl der Tage in Ihrem ursprünglichen Satz für jeden Tag im Bereich:

from datetime import datetime, timedelta 
dts = [datetime(2010, 11, 29, 10, 0, 0), datetime(2010, 11, 30, 10, 0, 0), 
     datetime(2010, 12, 4, 10, 0, 0)] 
dates = sorted(d.date() for d in dts) 

for d in range((dates[-1] - dates[0]).days + 1): 
    st = 'ok' if dates[0] + timedelta(days=d) in dates else 'skipped' 
    print 'Day %d: %s' % (d + 1, st) 

Ausgang:

Day 1: ok 
Day 2: ok 
Day 3: skipped 
Day 4: skipped 
Day 5: skipped 
Day 6: ok 

Hinweis: Ich habe mein eigenes Beispiel erstellt hier, weil ich Ich bin mir nicht sicher, ob das Beispiel, das du benutzt hast, wirklich Sinn macht.

5

nutzen die „RRULE“ Modul aus dem dateutil Paket, bei http://labix.org/python-dateutil gefunden

import datetime 
from dateutil import rrule 

dates = (datetime.datetime(2010, 11, 29), 
     datetime.datetime(2010, 11, 30), 
     datetime.datetime(2010, 12, 2)) 

all_dates = list(rrule.rrule(rrule.DAILY, count=5, 
       dtstart=datetime.datetime(2010, 11,29))) 

for (i, date) in enumerate(all_dates): 
    if date in dates: 
     status = "ok" 
    else: 
     status = "skipped" 

    print "Day %s: %s" % (i+1, status) 
+1

+1 für die Einführung in das 'Rule' Modul. Jetzt kann ich herausfinden, wann Ostern ist. – Pete

+0

+1, ziemlich coole Idee, ich wusste auch nicht über 'Rules', obwohl ich nicht sicher bin, dass ich ein neues Paket nur installieren möchte, um dieses Problem zu lösen. –