주 번호에서 날짜 가져 오기


88

내 코드에 무엇이 잘못되었는지 알려주세요.

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)

"2013-01-01 00:00:00"표시, 감사합니다.

답변:


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월요일을 요일로 사용합니다. 자신의 평일을 선택할 수는 있지만, 그 요일을 벗어나면 예상치 못한 결과를 얻을 수 있습니다.

설명서, 각주 4 의 strftime()strptime()동작 섹션을 참조하십시오 .

함께 사용하면 strptime()방법 %U%W주 올해의 날이 지정된 경우에만 계산에 사용된다.

주 번호가 ISO 주일 인 경우 %G-W%V-%u대신 사용하는 것이 좋습니다. 이러한 지시문에는 Python 3.6 이상이 필요합니다.


나는 당신에게 1 표 이상을 줄 수 있으면 좋겠다 ... 나는 그것이 왜 작동하지 않는지 알아 내기 위해 내 머리를 두드렸다.
Islam 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'. 2018 년 1 주차와 2 주차는 시작일이 동일합니다.
ozw1z5rd

2
@ ozw1z5rd : 2018 년에 0 주가 없기 때문입니다. 0 주차는 해당 연도의 첫 번째 월요일 이전의 부분 주입니다. 2018 년 첫 번째 월요일은 1 월 1 일입니다. 즉, 입력 문자열 은 기술이 아니라 여기서 문제이며 Python은 W0을 대신 W1을 의미하도록 해석하도록 오류를 수정했습니다.
Martijn Pieters

@ ozw1z5rd : 이것이 당신의 앱에 문제가된다면, 당신은 그러한 연도를 특별하게해야 할 것입니다. if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
Martijn Pieters

1
@darda : Python 3.6은 이미 ISO 8601 주 정의, 사용 %G(주 중 대부분의 경우 연도)을 지원합니다 %V.
Martijn Pieters

26

다른 답변을 완료하려면 -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 이상에서 사용 가능; 에서 문서 .


14

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.isocalendarISO8601 준수 주를 파악할 수 있습니다 .

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 (days = 6)를 추가하면 주말이 끝납니다.

datetime.datetime(2018, 7, 23)

@Senthikumar C는 아래와 같아야합니다res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
MD Alauddin Al-Amin

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)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.