파이썬에서 주 번호를 얻는 방법?


339

파이썬으로 6 월 16 일 (wk24)의 현재 주 번호를 확인하는 방법은 무엇입니까?


1
@Donal : 하나는 6 월 16 일, 다른 하나는 6 월 26 일에 보입니다.
— interjay

5
주 1을 정의하십시오. isocalendar ()가 유일한 방법은 아닙니다.
— Mark Tolonen

3
의 출력 strftime("%U", d)은와 다를 수 있습니다 isocalendar(). 예를 들어 연도를 2004 년으로 변경하면 24 주차를 사용 strftime()하고 25 주차를 사용 isocalendar()합니다.
— moooeeeep

답변:


409

datetime.dateisocalendar()달력 주를 포함하는 튜플을 반환 하는 메서드 가 있습니다 .

>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar()[1]
24

datetime.date.isocalendar () 는 주어진 날짜 인스턴스에 대해 연도, 주 번호 및 주일을 포함하는 튜플을 반환하는 인스턴스 메소드입니다.


7
' [1]' 를 설명 하거나 정보를 찾을 위치를 알려 주면 도움이 될 것 입니다.
— Jonathan Leffler

5
가장 쉬운 방법은 strftime, best import datetime today = datetime.now () week = today.strftime ( "% W")를 사용하여 주 번호를 추출하는 것 같습니다.
— bipsa

7
조금 늦었습니다. 그러나 내 컴퓨터에서는을 date(2010, 1, 1).isocalendar()[1]반환합니다 53. 워드 프로세서에서 "ISO의 2004 년의 첫 주 그래서 일요일 2004 년 1월 4일에 2003년 (월요일) 12월 29일과 끝에서 시작되도록 예를 들어, 2004, 목요일에 시작 date(2003, 12, 29).isocalendar() == (2004, 1, 1)하고 date(2004, 1, 4).isocalendar() == (2004, 1, 7)."
— jclancy

17
isocalendar()훌륭하지만 원하는 것이 맞는지 확인하십시오. 오늘은 완벽한 예입니다. 2016 년 1 월 1 일은 (2015, 53, 5)입니다. now.strftime("%W")하고 now.strftime("%U")있는 동일한 00하는 원하는 무엇 종종있다. STRFTIME 예
— DaveL17

좋은 하나, 방금 도움이 될 것이라고 생각하는 오늘을 추가했습니다. D
— Vitaliy Terziev

124

datetime에서 주 번호를 문자열로 직접 가져올 수 있습니다.

>>> import datetime
>>> datetime.date(2010, 6, 16).strftime("%V")
'24'

또한 다음에 대한 strftime매개 변수를 변경하여 연중 주 번호의 다른 "유형"을 얻을 수 있습니다 .

%U- 연도의 주 번호 (일요일의 첫 번째 요일) 를 0으로 채워진 10 진수로 나타냅니다. 첫 번째 일요일 이전의 새해의 모든 날은 0 주로 간주됩니다. 예 : 00 , 01,…, 53

%W-연도의 주 번호 ( 월요일 의 첫 번째 요일)를 10 진수로 나타냅니다. 첫 번째 월요일 이전의 새해의 모든 날은 0 주로 간주됩니다. 예 : 00 , 01,…, 53

[...]

( Python 3.6에 추가되어 일부 배포판의 Python 2.7로 백 포트 됨 ) 편의를 위해 C89 표준에 필요하지 않은 몇 가지 추가 지시문이 포함되어 있습니다. 이 매개 변수는 모두 ISO 8601 날짜 값에 해당합니다. 이 strftime()방법 과 함께 사용하면 일부 플랫폼에서 사용하지 못할 수 있습니다 .

[...]

%V- 월요일을 요일의 첫 번째 요일 로하는 10 진수 ISO 8601 주. 01주는 1 월 4 일이 포함 된 주입니다. 예 : 01 , 02,…, 53

from : datetime — 기본 날짜 및 시간 유형 — Python 3.7.3 문서

나는에서 그것에 대해 발견했습니다 여기에 . 그것은 파이썬 2.7.6에서 나를 위해 일했습니다.


어떤 리눅스 매뉴얼을 인용하고 있습니까? 파이썬 2.7.5와 3.3.2는 Invalid format string이 패턴을 말합니다 . 그들의 문서에는 언급되지 않았습니다 %V.
— Vsevolod Golovanov 11

3
내가 언급하지 않아서 죄송합니다 . 여기 에서 왔습니다 . 파이썬 2.7.6에서 저에게 효과적이었습니다.
— jotacor

2
좋은 대답입니다! 날짜의 '<YEAR>-<ISOWEEK>'표현에 관심이 있다면 %G-%V대신을 (를 ) 사용하고 싶습니다 %Y-%V. %GISO 연도%Y
— KenHBS

datetime.datetime (2010, 6, 16) .strftime ( "% V") 또는 this datetime.datetime (2010, 6, 16) .date (). strftime과 같이 작동하려면 다음과 같이 작성해야합니다. ( "% V")
— Einar

77

나는 date.isocalendar()대답이 될 것이라고 믿습니다 . 이 기사 는 ISO 8601 캘린더의 기본 원리를 설명합니다. Python 문서 의 datetime 페이지 에서 date.isocalendar () 부분을 확인하십시오 .

>>> dt = datetime.date(2010, 6, 16) 
>>> wk = dt.isocalendar()[1]
24

.isocalendar ()는 (year, wk num, wk day)로 3 튜플을 반환합니다. dt.isocalendar()[0]연도, dt.isocalendar()[1]주 번호, dt.isocalendar()[2]요일을 반환합니다. 가능한 한 간단합니다.


4
ISO 주간의 비 직관적 특성을 설명하는 링크는 +1입니다.
— Mark Ransom

27

다른 옵션이 있습니다.

import time
from time import gmtime, strftime
d = time.strptime("16 Jun 2010", "%d %b %Y")
print(strftime("%U", d))

인쇄합니다 24.

참조 : http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior


9
주가 월요일에 시작되면 % W.
— ZeWaren

1
이 방법은 문자열로 오는 날짜를 분할하거나 변환하지 않으려는 경우에 더 좋습니다. 문자열을 그대로 문자열 형식으로 strptime에 전달하고 두 번째 인수에 형식을 지정하십시오. 좋은 해결책. 주의 : 월요일에 주가 시작되면 % W.
— TheCuriousOne

22

다른 사람들이 제안한 ISO 주간은 좋은 것이지만 귀하의 요구에 맞지 않을 수도 있습니다. 매주 월요일로 시작한다고 가정하여 연말과 말에 흥미로운 예외가 발생합니다.

요일에 관계없이 1 주차가 항상 1 월 1 일부터 1 월 7 일까지 인 정의를 사용하려면 다음과 같이 파생을 사용하십시오.

>>> testdate=datetime.datetime(2010,6,16)
>>> print(((testdate - datetime.datetime(testdate.year,1,1)).days // 7) + 1)
24

3
isocalendar가 연말과 말에 "일부 흥미로운 예외"가 있다고 말하는 것은 약간 과소 평가 된 것으로 보입니다. isocalendar의 결과는 2014 년 12 월 29 일 00:00:00과 같은 일부 날짜 / 시간 값에 대해 매우 오해의 소지가 있습니다 (ISO 사양에서는 실제로 올바르지 않더라도). 아래의 내 항목).
— 케빈

3
@ 케빈, 그것은 잘못된 것이 아닙니다. 단지 그들의 정의가 당신의 것과 일치하지 않는다는 것입니다. ISO는 두 가지를 결정했습니다. 첫째 월요일부터 일요일까지는 전체 주가 같은 해에 있고 둘째는 대부분의 요일이 포함 된 해가 지정된 날짜입니다. 이로 인해 연도의 시작과 끝의 요일이 인접 연도로 이동합니다.
— Mark Ransom

6
동의했다. 그러나 대부분의 사람들의 정의에 따르면 2014 년 12 월 29 일은 2015 년 1 주차가 아닐 것입니다. 저는이 잠재적 혼란의 원인에 주목하고 싶었습니다.
— Kevin

이것이 바로 내가 찾던 것입니다. 이 작업을 수행하는 방법이 아니라 ISO에 관한 정보와 월요일부터 시작합니다.
— Amit Amola 13:14에

19

일반적으로 현재 주 번호를 얻으려면 (일요일부터 시작) :

from datetime import *
today = datetime.today()
print today.strftime("%U")

4
strftime ( '% U')의 문서에서 : "연도의 주 번호 (일요일의 첫 번째 요일)를 10 진수 [00,53]로 표시합니다. 첫 번째 일요일 이전의 새해의 모든 날이 고려됩니다 0 주일이되었습니다. "
— Dolan Antenucci

14

연중 순간의 정수 값에 대해 다음을 시도하십시오.

import datetime
datetime.datetime.utcnow().isocalendar()[1]

10

주 번호 매기기를위한 많은 시스템 이 있습니다 . 다음은 코드 예제와 함께 가장 일반적인 시스템입니다.

  • ISO : 첫주는 월요일로 시작하며 1 월 4 일을 포함해야합니다. ISO 캘린더는 이미 Python으로 구현되어 있습니다.

    >>> from datetime import date
    >>> date(2014, 12, 29).isocalendar()[:2]
    (2015, 1)
  • 북미 : 첫주는 일요일로 시작하며 1 월 1 일을 포함해야합니다. 다음 코드는 북미 시스템에 대한 수정 된 Python ISO 캘린더 구현 버전입니다.

    from datetime import date
    
    def week_from_date(date_object):
        date_ordinal = date_object.toordinal()
        year = date_object.year
        week = ((date_ordinal - _week1_start_ordinal(year)) // 7) + 1
        if week >= 52:
            if date_ordinal >= _week1_start_ordinal(year + 1):
                year += 1
                week = 1
        return year, week
    
    def _week1_start_ordinal(year):
        jan1 = date(year, 1, 1)
        jan1_ordinal = jan1.toordinal()
        jan1_weekday = jan1.weekday()
        week1_start_ordinal = jan1_ordinal - ((jan1_weekday + 1) % 7)
        return week1_start_ordinal
    >>> from datetime import date
    >>> week_from_date(date(2014, 12, 29))
    (2015, 1)
  • MMWR (CDC) : 첫주는 일요일로 시작하며 1 월 4 일을 포함해야합니다. 이 번호 시스템을 위해 특별히 epiweeks 패키지를 만들었습니다 (ISO 시스템도 지원함). 예를 들면 다음과 같습니다.
    >>> from datetime import date
    >>> from epiweeks import Week
    >>> Week.fromdate(date(2014, 12, 29))
    (2014, 53)

8

보드에서 isocalendar 주 번호 만 사용하는 경우 다음이 충분해야합니다.

import datetime
week = date(year=2014, month=1, day=1).isocalendar()[1]

이것은 우리 주 번호에 대해 isocalendar에 의해 리턴 된 튜플의 두 번째 멤버를 검색합니다.

그러나 그레고리력을 다루는 날짜 함수를 사용하려는 경우 isocalendar만으로는 작동하지 않습니다! 다음 예제를 보자.

import datetime
date = datetime.datetime.strptime("2014-1-1", "%Y-%W-%w")
week = date.isocalendar()[1]

이 문자열은 2014 년 첫 주 월요일을 날짜로 반환한다고합니다. 여기서 isocalendar를 사용하여 주 번호를 검색하면 동일한 주 번호를 다시 얻을 것으로 예상되지만 그렇지 않습니다. 대신 우리는 2의 주 번호를 얻습니다. 왜?

그레고리력의 1 주차는 월요일이 포함 된 첫 주입니다. isocalendar의 1 주차는 목요일을 포함하는 첫 번째 주입니다. 2014 년 초의 부분 주에는 목요일이 포함되어 있기 때문에 이것은 isocalendar의 1 주차이고 date2 주차가됩니다.

우리가 그레고리력 주간을 원한다면, 아이소 칼렌다 르에서 그레고리력으로 변환해야합니다. 트릭을 수행하는 간단한 함수는 다음과 같습니다.

import datetime

def gregorian_week(date):
    # The isocalendar week for this date
    iso_week = date.isocalendar()[1]

    # The baseline Gregorian date for the beginning of our date's year
    base_greg = datetime.datetime.strptime('%d-1-1' % date.year, "%Y-%W-%w")

    # If the isocalendar week for this date is not 1, we need to 
    # decrement the iso_week by 1 to get the Gregorian week number
    return iso_week if base_greg.isocalendar()[1] == 1 else iso_week - 1

6

다음과 같이 % W 지시문을 시도 할 수 있습니다.

d = datetime.datetime.strptime('2016-06-16','%Y-%m-%d')
print(datetime.datetime.strftime(d,'%W'))

'% W': 연도의 주 번호 (월요일의 첫 번째 요일)를 10 진수로 나타냅니다. 첫 번째 월요일 이전의 새해의 모든 날은 0 주로 간주됩니다. (00, 01, ..., 53)


2

isocalendar ()는 일부 날짜에 대해 잘못된 연도 및 주 번호를 반환합니다.

Python 2.7.3 (default, Feb 27 2014, 19:58:35) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime as dt
>>> myDateTime = dt.datetime.strptime("20141229T000000.000Z",'%Y%m%dT%H%M%S.%fZ')
>>> yr,weekNumber,weekDay = myDateTime.isocalendar()
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2015, weekNumber is 1

Mark Ransom의 접근 방식과 비교하십시오.

>>> yr = myDateTime.year
>>> weekNumber = ((myDateTime - dt.datetime(yr,1,1)).days/7) + 1
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2014, weekNumber is 52

3
iso8601 달력에 대한 일부 링크 (예 : staff.science.uu.nl/~gent0113/calendar/isocalendar.htm )를 보면 isocalendar ()에 의해 반환 된 연도 및 주 번호 값이 "잘못된"값이 아님을 알 수 있습니다. 예를 들어 ISO8601에서 2004 년은 2003 년 12 월 29 일에 시작했습니다. 따라서 isocalendar ()는 2014 년 12 월 29 일에 2015 년을 반환하는 데 정확할 수 있지만 많은 사람들의 목적에 따라 이것은 오도 될 것입니다 .
— Kevin

2

토론을 두 단계로 요약합니다.

  1. 원시 형식을 datetime객체로 변환하십시오 .
  2. datetime개체 또는 개체 의 기능을 사용하여 date주 번호를 계산하십시오.

워밍업

```파이썬

from datetime import datetime, date, time
d = date(2005, 7, 14)
t = time(12, 30)
dt = datetime.combine(d, t)
print(dt)

```

1 단계

수동으로 생성하려면 datetime개체를 우리가 사용할 수 있습니다 datetime.datetime(2017,5,3)또는 datetime.datetime.now().

그러나 실제로는 기존 문자열을 구문 분석해야합니다. 형식을 구체적으로 지정해야하는 strptime기능 을 사용할 수 있습니다 datetime.strptime('2017-5-3','%Y-%m-%d'). 다른 형식 코드에 대한 자세한 내용은 공식 문서를 참조하십시오 .

또는 더 편리한 방법은 dateparse 모듈 을 사용하는 것 입니다. 예는 dateparser.parse('16 Jun 2010'), dateparser.parse('12/2/12')또는dateparser.parse('2017-5-3')

위의 두 가지 접근 방식은 datetime객체 를 반환 합니다.

2 단계

획득 한 datetime객체를 사용하여을 호출 strptime(format)합니다. 예를 들어

```파이썬

dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object. This day is Sunday
print(dt.strftime("%W")) # '00' Monday as the 1st day of the week. All days in a new year preceding the 1st Monday are considered to be in week 0.
print(dt.strftime("%U")) # '01' Sunday as the 1st day of the week. All days in a new year preceding the 1st Sunday are considered to be in week 0.
print(dt.strftime("%V")) # '52' Monday as the 1st day of the week. Week 01 is the week containing Jan 4.

```

사용할 형식을 결정하는 것은 매우 까다 롭습니다. 더 좋은 방법은 date호출 할 객체를 얻는 것입니다 isocalendar(). 예를 들어

```파이썬

dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object
d = dt.date() # convert to a date object. equivalent to d = date(2017,1,1), but date.strptime() don't have the parse function
year, week, weekday = d.isocalendar() 
print(year, week, weekday) # (2016,52,7) in the ISO standard

```

실제로, date.isocalendar()특히 "크리스마스-새해"쇼핑 시즌에 매주 보고서를 작성하는 데 더 많이 사용할 것 입니다.


0
userInput = input ("Please enter project deadline date (dd/mm/yyyy/): ")

import datetime

currentDate = datetime.datetime.today()

testVar = datetime.datetime.strptime(userInput ,"%d/%b/%Y").date()

remainDays = testVar - currentDate.date()

remainWeeks = (remainDays.days / 7.0) + 1


print ("Please pay attention for deadline of project X in days and weeks are  : " ,(remainDays) , "and" ,(remainWeeks) , "Weeks ,\nSo  hurryup.............!!!") 

-1

많은 답변이 제공되었지만 아이디에 추가하고 싶습니다.

주를 연도 / 주 스타일로 표시해야하는 경우 (예 : 1953-2019 년 53 주, 2001-2020 년 1 주 등) 다음을 수행 할 수 있습니다.

import datetime

year = datetime.datetime.now()
week_num = datetime.date(year.year, year.month, year.day).strftime("%V")
long_week_num = str(year.year)[0:2] + str(week_num)

현재 연도 및 주가 소요되며 작성일의 long_week_num은 다음과 같습니다.

>>> 2006

date()처음부터 새로 만드는 이유는 무엇 입니까? datetime.datetime()인스턴스에는 .date()해당 작업에 대한 메소드가 있습니다.
— Martijn Pieters

그러나 더 걱정스럽게도 귀하의 답변이 현재 연도가 아닌 세기를 선택한다는 것 입니다. 그리고 주 번호에 문자열 형식을 사용하려는 경우 연도를 포함하기 위해 문자열 형식을 사용하지 않는 이유는 무엇입니까?
— Martijn Pieters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.