파이썬으로 6 월 16 일 (wk24)의 현재 주 번호를 확인하는 방법은 무엇입니까?
strftime("%U", d)
은와 다를 수 있습니다 isocalendar()
. 예를 들어 연도를 2004 년으로 변경하면 24 주차를 사용 strftime()
하고 25 주차를 사용 isocalendar()
합니다.
파이썬으로 6 월 16 일 (wk24)의 현재 주 번호를 확인하는 방법은 무엇입니까?
strftime("%U", d)
은와 다를 수 있습니다 isocalendar()
. 예를 들어 연도를 2004 년으로 변경하면 24 주차를 사용 strftime()
하고 25 주차를 사용 isocalendar()
합니다.
답변:
datetime.date
isocalendar()
달력 주를 포함하는 튜플을 반환 하는 메서드 가 있습니다 .
>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar()[1]
24
datetime.date.isocalendar () 는 주어진 날짜 인스턴스에 대해 연도, 주 번호 및 주일을 포함하는 튜플을 반환하는 인스턴스 메소드입니다.
[1]
' 를 설명 하거나 정보를 찾을 위치를 알려 주면 도움이 될 것 입니다.
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)
."
isocalendar()
훌륭하지만 원하는 것이 맞는지 확인하십시오. 오늘은 완벽한 예입니다. 2016 년 1 월 1 일은 (2015, 53, 5)
입니다. now.strftime("%W")
하고 now.strftime("%U")
있는 동일한 00
하는 원하는 무엇 종종있다. STRFTIME 예
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
나는에서 그것에 대해 발견했습니다 여기에 . 그것은 파이썬 2.7.6에서 나를 위해 일했습니다.
Invalid format string
이 패턴을 말합니다 . 그들의 문서에는 언급되지 않았습니다 %V
.
%G-%V
대신을 (를 ) 사용하고 싶습니다 %Y-%V
. %G
ISO 연도%Y
나는 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]
주 번호 매기기를위한 많은 시스템 이 있습니다 . 다음은 코드 예제와 함께 가장 일반적인 시스템입니다.
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)
>>> from datetime import date
>>> from epiweeks import Week
>>> Week.fromdate(date(2014, 12, 29))
(2014, 53)
보드에서 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 주차이고 date
2 주차가됩니다.
우리가 그레고리력 주간을 원한다면, 아이소 칼렌다 르에서 그레고리력으로 변환해야합니다. 트릭을 수행하는 간단한 함수는 다음과 같습니다.
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
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
토론을 두 단계로 요약합니다.
datetime
객체로 변환하십시오 .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.............!!!")
많은 답변이 제공되었지만 아이디에 추가하고 싶습니다.
주를 연도 / 주 스타일로 표시해야하는 경우 (예 : 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()
해당 작업에 대한 메소드가 있습니다.