Python: Geben Sie Daten zu Beginn und Ende der Woche ab einem bestimmten Datum an

75
day = "13/Oct/2013"
print("Parsing :",day)
day, mon, yr= day.split("/")
sday = yr+" "+day+" "+mon
myday = time.strptime(sday, '%Y %d %b')
Sstart = yr+" "+time.strftime("%U",myday )+" 0"
Send = yr+" "+time.strftime("%U",myday )+" 6"
startweek = time.strptime(Sstart, '%Y %U %w')
endweek = time.strptime(Send, '%Y %U %w')
print("Start of week:",time.strftime("%a, %d %b %Y",startweek))
print("End of week:",time.strftime("%a, %d %b %Y",endweek))
print("Data entered:",time.strftime("%a, %d %b %Y",myday))

out:
Parsing : 13/Oct/2013
Start of week: Sun, 13 Oct 2013
End of week: Sat, 19 Oct 2013
Sun, 13 Oct 2013

Ich habe Python in den letzten 2 Tagen gelernt und mich gefragt, ob es einen saubereren Weg gibt, dies zu tun. Diese Methode funktioniert ... es sieht einfach hässlich aus und es scheint albern, für jedes Datum eine neue Zeitvariable erstellen zu müssen, und das sollte es auch Es ist eine Möglichkeit, das angegebene Datum durch einen einfachen Anruf auf den Anfang und das Ende der Woche zu verschieben, aber ich konnte im Internet oder in der Dokumentation nichts finden, was so aussieht, als würde es funktionieren.

shadowtdt09
quelle
1
Dies ist keine Programmierkritik, aber ich habe noch nie jemanden gesehen, der ein Datum wie "13 / Oct / 2013" geschrieben hat. Sind Sie sicher, dass Sie die Eingabe auf diese Weise analysieren möchten?
Brionius
@Brionius Ich weiß nicht, woher OP kommt, aber hier in meinem Land ist dieses Format ziemlich verbreitet (und vielleicht sogar das häufigste).
Hyperboreus
3
Huh - wie interessant. Ich habe noch nie nicht numerische Segmente in einer auf Schrägstrichen basierenden Datumsnotation gesehen.
Brionius

Antworten:

174

Verwenden Sie das datetimeModul.

Dies ergibt Anfang und Ende der Woche (von Montag bis Sonntag):

from datetime import datetime, timedelta

day = '12/Oct/2013'
dt = datetime.strptime(day, '%d/%b/%Y')
start = dt - timedelta(days=dt.weekday())
end = start + timedelta(days=6)
print(start)
print(end)

BEARBEITEN:

print(start.strftime('%d/%b/%Y'))
print(end.strftime('%d/%b/%Y'))
Hyperboreus
quelle
2
ist das Starten und Beenden eines datetime-Objekts oder eine Zeichenfolge. Ich muss die Ausgabe so formatieren, wie meine Frage ursprünglich gestellt wurde, und ich habe versucht, datetime.strftime ("% a,% d% b% Y", end) zu verwenden, aber es hieß, end sei ein Stich, kein datetime-Objekt.
shadowtdt09
1
Vielen Dank für die Hilfe, eine letzte Frage: Gibt es eine Möglichkeit, den Wochenanfang auf Sonntag anstatt auf Montag zu ändern?
shadowtdt09
17
Verschieben Sie den Wochentag einfach um einen Tag. So etwas start = dt - timedelta(days = (dt.weekday() + 1) % 7)sollte funktionieren.
Hyperboreus
Wie kann Addition und Subtraktion funktionieren, wenn es auch am Tag eine Zeitkomponente gibt? So etwas wie day = '12/10/2013 13:43:43'?
Vineet Menon
1
@SaravananNandhan stellen Sie sicher, dass Sie datetime von datetime importieren, nicht nur von datetime. Also from datetime import datetimeund NICHTimport datetime
Guival
28

Leichte Abweichung, wenn Sie die Standardzeitformatierung beibehalten und sich auf den aktuellen Tag beziehen möchten:

from datetime import datetime, timedelta

today = datetime.now().date()
start = today - timedelta(days=today.weekday())
end = start + timedelta(days=6)
print("Today: " + str(today))
print("Start: " + str(start))
print("End: " + str(end))
Palamunder
quelle
18

Verwenden Sie das Pendelmodul :

today = pendulum.now()
start = today.start_of('week')
end = today.end_of('week')
ogeretal
quelle
Das ist genau das, was ich brauchte
Raveen Beemsingh
1
... genau das brauchen Sie, solange Ihre Woche am Sonntagabend beginnt und endet. Pendel hat anscheinend keine Möglichkeit, das Ende der Woche auf Samstag um 23:59:59 Uhr festzulegen.
Aaron C. de Bruyn
2
Ich habe heute etwas über Pendel erfahren. Laut den Dokumenten beginnt die wahre # ISO8601-Woche am Montag und endet am Sonntag. Es wäre eine Schande gewesen, wenn dies nicht geändert werden könnte. Nach einigem Suchen fand ich dies . Wenn Sie also pendulum.week_starts_at(pendulum.SUNDAY)und hinzufügen pendulum.week_ends_at(pendulum.SATURDAY), sollten Sie in der Lage sein, mit den Methoden start_of()und die richtigen Daten zu erhalten end_of(). Ich bin mir nicht sicher, ob dies der richtige Weg ist, aber es scheint in meinen Tests zu funktionieren.
k427h1c