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


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.