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.

117
Ali SAID OMAR 13 Juni 2013 im 16:39

6 Antworten

Beste Antwort

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 strftime() und strptime() Abschnitt Verhalten in der Dokumentation, Fußnote 4:

Bei Verwendung mit der Methode strptime() werden %U und %W nur dann in Berechnungen verwendet, wenn der Wochentag und das Jahr angegeben sind.

Beachten Sie, dass Sie {{X0 }} stattdessen! Diese Anweisungen erfordern Python 3.6 oder neuer.

132
Martijn Pieters 25 Jän. 2019 im 19:55

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)
1
dimosbele 4 Okt. 2019 im 07:14

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-Äquivalente von %Y, %W, %w.

2013-06-24 00:00:00

Verfügbar in Python 3.6+; aus docs.

15
Luka Kikelj 9 Juli 2019 im 06:25
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)
5
Senthilkumar C 23 Juli 2018 im 07:17

Hier ist eine praktische Funktion, einschließlich der Problem mit Null-Woche.

0
Ron 5 Juli 2018 im 15:12

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 datetime.date.isocalendar verwenden, um die Woche zu ermitteln, die ISO8601-konform ist:

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.

1
Jens W. Klein 5 Dez. 2019 im 17:58