Будь ласка, що сталося з моїм кодом:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Дисплей "01.01.2013 00:00:00", Дякую.
Будь ласка, що сталося з моїм кодом:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Дисплей "01.01.2013 00:00:00", Дякую.
Відповіді:
Кількості тижня недостатньо для створення дати; вам потрібен і день тижня. Додайте за замовчуванням:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)
-1
І -%w
шаблон говорить аналізатор , щоб вибрати понеділок у цьому тижні. Це виводить:
2013-07-01 00:00:00
%W
використовує понеділок як перший день тижня. Хоча ви можете вибрати власний будній день, ви можете отримати несподівані результати, якщо відхилятись від цього.
Див. Розділ поведінки strftime()
та strptime()
поведінки в документації, виноска 4:
При використанні з
strptime()
методом,%U
і%W
використовуються у розрахунках лише тоді, коли вказані день тижня та рік.
Зауважте, якщо номер вашого тижня - дата тижня ISO , ви хочете використовувати його %G-W%V-%u
! Ці директиви вимагають Python 3.6 або новішої версії.
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
%G
(більшу частину тижня) і %V
в такому випадку.
Щоб заповнити інші відповіді - якщо ви використовуєте номери тижнів ISO , цей рядок підходить (щоб отримати понеділок заданого номера тижня ISO):
import datetime
d = '2013-W26'
r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u')
print(r)
%G
, %V
, %u
Є ISO еквіваленти %Y
, %W
, %w
, так що виходи:
2013-06-24 00:00:00
Доступний у Python 3.6+; з документів .
У Python 3.8 є зручне datetime.date.fromisocalendar
:
>>> from datetime import date
>>> date.fromisocalendar(2020, 1, 1) # (year, week, day of week)
datetime.date(2019, 12, 30, 0, 0)
У старих версіях Python (3.7-) для розрахунку може використовуватися інформація, datetime.date.isocalendar
щоб визначити тиждень, що відповідає стандарту 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))
Обидва роботи також з datetime.datetime
.
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res
Якщо додати 1 як тижневий день, ви отримаєте точний початок поточного тижня. Додавання timedelta (днів = 6) дасть вам кінець тижня.
datetime.datetime(2018, 7, 23)
res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
Якщо у вас річна кількість тижнів, просто додайте кількість тижнів до першого дня року.
>>> 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)
Ось зручна функція, включаючи проблему з нульовим тижнем.