development

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

big-blog 2020. 3. 18. 08:06
반응형

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


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


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

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

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


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에서 나를 위해 일했습니다.


나는 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]반환하고, 요일을 반환합니다. 가능한 한 간단합니다.


다른 옵션이 있습니다 :

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


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

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

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

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

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

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

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

보드에서 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

datetime.datetime.isocalendar를 보십시오 .


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

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

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


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

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

  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()특히 "크리스마스-새해"쇼핑 시즌에 매주 보고서를 작성하는 데 더 많이 사용할 것 입니다.


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.............!!!") 

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

  • 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 패키지를 만들었습니다 . 예를 들면 다음과 같습니다.
    >>> from datetime import date
    >>> from epiweeks import Week
    >>> Week.fromdate(date(2014, 12, 29))
    (2014, 53)
    

참고 URL : https://stackoverflow.com/questions/2600775/how-to-get-week-number-in-python

반응형