개발/Python

[파이썬] 1년의 몇 번째 주에서 날짜 구하기

MinorMan 2022. 10. 7. 08:39
반응형

<질문>

내 코드에 무엇이 문제인지 알려주세요.

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

디스플레이 "2013-01-01 00:00:00", 감사합니다.


<답변1>

주 번호는 날짜를 생성하기에 충분하지 않습니다. 요일도 필요합니다. 기본값 추가:

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() and strptime() behaviour 문서의 섹션, 각주 4:

strptime() 메서드와 함께 사용하면 %U와 %W는 요일과 연도가 지정된 경우에만 계산에 사용됩니다.

주 번호가ISO week date, 사용하고 싶을 것입니다%G-W%V-%u 대신에! 이러한 지시문에는 Python 3.6 이상이 필요합니다.


<답변2>

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


<답변3>

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.


<답변4>

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

요일로 1을 추가하면 정확한 현재 주 시작이 생성됩니다. timedelta(days=6)를 추가하면 주말이 됩니다.

datetime.datetime(2018, 7, 23)

<답변5>

연간 주 수가 있는 경우 해당 연도의 첫 번째 날에 주 수를 추가하기만 하면 됩니다.

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

<답변6>

누구든지 주 번호에서 모든 근무일(Mo-Fr) 날짜를 반환하는 간단한 함수를 찾고 있다면 이것을 고려하십시오(기준accepted answer)

import datetime

def weeknum_to_dates(weeknum):
    return [datetime.datetime.strptime("2021-W"+ str(weeknum) + str(x), "%Y-W%W-%w").strftime('%d.%m.%Y') for x in range(-5,0)]

weeknum_to_dates(37)

산출:

['17.09.2021', '16.09.2021', '15.09.2021', '14.09.2021', '13.09.2021']

<답변7>

여기handy function 제로 위크 문제를 포함합니다.

반응형