Отримайте дату за номером тижня


Відповіді:


175

Кількості тижня недостатньо для створення дати; вам потрібен і день тижня. Додайте за замовчуванням:

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 або новішої версії.


1
Я хотів би дати вам більше 1 голосу ... Я бився головою, щоб зрозуміти, чому це не працює.
Іслам Q.

2
Не працює. datetime.datetime.strptime ("2018-W0-0", "% YW% W-% w") == datetime.datetime.strptime ("2018-W1-0", "% YW% W-% w") -> "2018-01-07 00:00:00". 1-й та 2-й тижні 2018 року мають однакову дату початку.
ozw1z5rd

2
@ ozw1z5rd: це тому, що в 2018 році немає тижня 0. Тиждень 0 - частковий тиждень до першого понеділка року; у 2018 році перший понеділок - 1 січня. Іншими словами, проблема полягає у вашому вхідному рядку , а не в техніці, і Python виправив помилки, щоб інтерпретувати W0 як значення W1.
Мартін Пітерс

@ ozw1z5rd: Якщо це проблема для вашої програми, вам доведеться взяти до уваги такі випадки; if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
Мартін Пітерс

1
@darda: Python 3.6 вже підтримує визначення тижня за стандартом ISO 8601, використання %G(більшу частину тижня) і %Vв такому випадку.
Мартін Пітерс

27

Щоб заповнити інші відповіді - якщо ви використовуєте номери тижнів 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+; з документів .


13

У 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.


6
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res

Якщо додати 1 як тижневий день, ви отримаєте точний початок поточного тижня. Додавання timedelta (днів = 6) дасть вам кінець тижня.

datetime.datetime(2018, 7, 23)

@Senthikumar C, що має бути як нижчеres = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
доктор медичних наук Алауддін Аль-Амін

1

Якщо у вас річна кількість тижнів, просто додайте кількість тижнів до першого дня року.

>>> 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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.