Proszę, co jest nie tak z moim kodem:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Wyświetl „2013-01-01 00:00:00”, dzięki.
Proszę, co jest nie tak z moim kodem:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Wyświetl „2013-01-01 00:00:00”, dzięki.
Odpowiedzi:
Numer tygodnia nie wystarczy, aby wygenerować datę; potrzebujesz również dnia tygodnia. Dodaj domyślne:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)
-1
I -%w
wzorzec mówi parser odebrać w poniedziałek w tym tygodniu. To daje:
2013-07-01 00:00:00
%W
używa poniedziałku jako pierwszego dnia tygodnia. Chociaż możesz wybrać własny dzień tygodnia, możesz uzyskać nieoczekiwane rezultaty, jeśli odejdziesz od tego.
Zobacz sekcję strftime()
i strptime()
zachowanie w dokumentacji, przypis 4:
W połączeniu z tą
strptime()
metodą%U
i%W
są używane tylko w obliczeniach, gdy określony jest dzień tygodnia i rok.
Uwaga, jeśli Twój numer tygodnia jest datą tygodnia ISO , będziesz chciał użyć %G-W%V-%u
zamiast tego! Te dyrektywy wymagają języka Python 3.6 lub nowszego.
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
%G
(rok przez większą część tygodnia) iw %V
takim przypadku.
Aby uzupełnić pozostałe odpowiedzi - jeśli korzystasz z numerów tygodni ISO , ten ciąg jest odpowiedni (aby uzyskać poniedziałek z danego numeru tygodnia ISO):
import datetime
d = '2013-W26'
r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u')
print(r)
%G
, %V
, %u
Są odpowiednikami ISO o %Y
, %W
, %w
, więc wyjść:
2013-06-24 00:00:00
Dostępne w Pythonie 3.6+; z dokumentów .
W Pythonie 3.8 jest przydatne datetime.date.fromisocalendar
:
>>> from datetime import date
>>> date.fromisocalendar(2020, 1, 1) # (year, week, day of week)
datetime.date(2019, 12, 30, 0, 0)
W starszych wersjach Pythona (3.7-) obliczenia mogą wykorzystywać informacje z datetime.date.isocalendar
do określenia tygodni tygodnia zgodnych z ISO8601:
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))
Oba działa również z datetime.datetime
.
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res
Dodanie 1 jako dnia tygodnia da dokładny początek bieżącego tygodnia. Dodanie timedelta (dni = 6) da ci koniec tygodnia.
datetime.datetime(2018, 7, 23)
res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
Jeśli masz roczny numer tygodnia, po prostu dodaj liczbę tygodni do pierwszego dnia roku.
>>> 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)
Oto przydatna funkcja obejmująca problem z tygodniem zerowym.