Пожалуйста, что не так с моим кодом:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Отображение «2013-01-01 00:00:00», спасибо.
Пожалуйста, что не так с моим кодом:
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Отображение «2013-01-01 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)
Вот удобная функция, включающая проблему с нулевой неделей.