Bitte was ist los mit meinem Code:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Anzeige "2013-01-01 00:00:00", Danke.
Bitte was ist los mit meinem Code:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Anzeige "2013-01-01 00:00:00", Danke.
Antworten:
Eine Wochennummer reicht nicht aus, um ein Datum zu generieren. Sie brauchen auch einen Wochentag. Standard hinzufügen:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)
Das Muster -1
und -%w
weist den Parser an, den Montag in dieser Woche auszuwählen. Dies gibt aus:
2013-07-01 00:00:00
%W
verwendet Montag als ersten Tag der Woche. Während Sie Ihren eigenen Wochentag auswählen können, können Sie unerwartete Ergebnisse erhalten, wenn Sie davon abweichen.
Siehe Abschnitt strftime()
und strptime()
Verhalten in der Dokumentation, Fußnote 4:
Bei Verwendung mit der
strptime()
Methode%U
und%W
nur bei Berechnungen, wenn der Wochentag und das Jahr angegeben sind.
Hinweis: Wenn Ihre Wochennummer ein ISO-Wochendatum ist , möchten Sie %G-W%V-%u
stattdessen verwenden! Diese Anweisungen erfordern Python 3.6 oder neuer.
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
%G
(Jahr für den größten Teil der Woche) und %V
in diesem Fall.
Um die anderen Antworten zu vervollständigen: Wenn Sie ISO- Wochennummern verwenden, ist diese Zeichenfolge geeignet (um den Montag einer bestimmten ISO-Wochennummer abzurufen):
import datetime
d = '2013-W26'
r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u')
print(r)
%G
, %V
, %u
Sind ISO Äquivalenten %Y
, %W
, %w
, so dass diese Ausgänge:
2013-06-24 00:00:00
Verfügbar in Python 3.6+; aus docs .
In Python 3.8 gibt es das Praktische datetime.date.fromisocalendar
:
>>> from datetime import date
>>> date.fromisocalendar(2020, 1, 1) # (year, week, day of week)
datetime.date(2019, 12, 30, 0, 0)
In älteren Python-Versionen (3.7-) kann die Berechnung die Informationen aus verwenden datetime.date.isocalendar
, um die ISO8601-kompatiblen Wochenwochen zu ermitteln:
from datetime import date, timedelta
def monday_of_calenderweek(year, week):
first = date(year, 1, 1)
base = 1 if first.isocalendar()[1] == 1 else 8
return first + timedelta(days=base - first.isocalendar()[2] + 7 * (week - 1))
Beides funktioniert auch mit datetime.datetime
.
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res
Das Hinzufügen von 1 als Wochentag ergibt den genauen aktuellen Wochenstart. Durch Hinzufügen von timedelta (Tage = 6) erhalten Sie das Wochenende.
datetime.datetime(2018, 7, 23)
res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
Wenn Sie die jährliche Anzahl von Wochen haben, addieren Sie einfach die Anzahl von Wochen zum ersten Tag des Jahres.
>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> week = 40
>>> year = 2019
>>> date = datetime.date(year,1,1)+relativedelta(weeks=+week)
>>> date
datetime.date(2019, 10, 8)
Hier ist eine praktische Funktion, einschließlich des Problems mit der Nullwoche.