2010-03-04 9 views
15

Mit Python möchte ich das Datum Objekt für letzten Mittwoch suchen. Ich kann herausfinden, wo heute mit isocalendar im Kalender steht, und bestimmen, ob wir eine Woche zurückgehen müssen, um zum vorherigen Mittwoch zu kommen. Ich kann jedoch nicht herausfinden, wie ein neues Datumsobjekt mit diesen Informationen erstellt wird. Im Wesentlichen muss ich herausfinden, wie man ein Datum aus einem ISO-Kalender-Tupel erstellt.Wie bekomme ich das Python-Datum-Objekt für letzten Mittwoch

from datetime import date 
today = date.today() 
if today.isocalendar()[2] > 3: #day of week starting with Monday 
    #get date for Wednesday of last week 
else: 
    #get date for Wednesday of this current week 
+0

Bitte sagen Sie explizit, was zu tun ist, wenn heute Mittwoch ist. Ist der ISO-Kalender für Ihr Problem relevant oder nur ein Artefakt Ihrer Lösungsversuche? –

+1

Nur ein Artefakt. DisplacedAussie hat es auf den Kopf genagelt. – roktechie

Antwort

38

Ich denke, dass Sie das wollen. Wenn der angegebene Tag ein Mittwoch ist, erhalten Sie diesen Tag.

from datetime import date 
from datetime import timedelta 

today = date.today() 
offset = (today.weekday() - 2) % 7 
last_wednesday = today - timedelta(days=offset) 

Beispiel, der letzte Mittwoch für jeden Tag März:

for x in xrange(1, 32): 
    today = date(year=2010, month=3, day=x) 
    offset = (today.weekday() - 2) % 7 
    last_wednesday = today - timedelta(days=offset) 

    print last_wednesday 
-1

lesen http://docs.python.org/library/datetime.html

Ihre eigene Funktion schreiben mit date2 = date1 - Timedelta (Tag = 1) und date.isoweekday() Iterieren über Vortage während isoweek nicht gleich 3 (Mittwoch) ist

+1

wird sicherlich funktionieren, aber das ist furchtbar ineffizient. –

+3

Schrecklich scheint ein bisschen hart, wenn man bedenkt, wie wenig Max-Vergleiche, er fragte nach einer Funktion zu bekommen letzten Mittwoch, die wahrscheinlich nicht oft aufgerufen werden wird (ich stimme zu, ich warf etwas zu schnell zusammen. –

-1

ich bin mir nicht sicher, ob dies Ihre Anforderungen erfüllt, aber es sollte Ihnen Mittwoch am nächsten zu einem bestimmten Zeitpunkt Mittwoch in der gleichen Woche wie dem angegebenen Datum erhalten, vorausgesetzt, Wochen beginnen am Montag:

import datetime 

def find_closest_wednesday(date): 
    WEDNESDAY = 3 
    year, week, day = date.isocalendar() 
    delta = datetime.timedelta(days=WEDNESDAY-day) 
    return date + delta 

today = datetime.date.today() 
print 'Today: ', today 
print 'Closest Wendesday: ', find_closest_wednesday(today) 
7

Unter der Annahme, dass „am vergangenen Mittwoch“ nicht die gleichen wie „heute“ sein, das zeigt, wie es für jede tun Tag der Woche:

>>> from datetime import date 
>>> from datetime import timedelta 
>>> 
>>> MON, TUE, WED, THU, FRI, SAT, SUN = range(7) 
>>> 
>>> def lastWday(adate, w): 
...  """Mon:w=0, Sun:w=6""" 
...  delta = (adate.weekday() + 6 - w) % 7 + 1 
...  return adate - timedelta(days=delta) 
... 
>>> for x in range(8, 16): 
...  start = date(year=2010, month=3, day=x) 
...  prev = lastWday(start, WED) 
...  print start, start.weekday(), prev, prev.weekday() 
... 
2010-03-08 0 2010-03-03 2 
2010-03-09 1 2010-03-03 2 
2010-03-10 2 2010-03-03 2 
2010-03-11 3 2010-03-10 2 
2010-03-12 4 2010-03-10 2 
2010-03-13 5 2010-03-10 2 
2010-03-14 6 2010-03-10 2 
2010-03-15 0 2010-03-10 2 
+0

Dies ist sehr hilfreich. Normalerweise wenn Ich führe ein Programm an einem Dienstag, und ich möchte wissen, was "letzter Dienstag" ist, ich meine nicht "heute". Ich meine den, der abgeschlossen hat ... was vor einer Woche war. Diese Antwort hat es mir ermöglicht Beseitigen Sie eine "if" -Anweisung in meinem Code. –

Verwandte Themen