복붙노트

[PYTHON] datetime.isocalendar ()의 역함수를 찾는 가장 좋은 방법은 무엇입니까?

PYTHON

datetime.isocalendar ()의 역함수를 찾는 가장 좋은 방법은 무엇입니까?

Python datetime.isocalendar () 메서드는 주어진 datetime 객체에 대한 튜플 (ISO_year, ISO_week_number, ISO_weekday)을 반환합니다. 해당 역함수가 있습니까? 그렇지 않다면 일년, 주 번호 및 요일에 주어진 날짜를 계산하는 쉬운 방법이 있습니까?

해결법

  1. ==============================

    1.나는 최근에이 문제를 직접 해결해야했고이 해결책을 내놓았다.

    나는 최근에이 문제를 직접 해결해야했고이 해결책을 내놓았다.

    import datetime
    
    def iso_year_start(iso_year):
        "The gregorian calendar date of the first day of the given ISO year"
        fourth_jan = datetime.date(iso_year, 1, 4)
        delta = datetime.timedelta(fourth_jan.isoweekday()-1)
        return fourth_jan - delta 
    
    def iso_to_gregorian(iso_year, iso_week, iso_day):
        "Gregorian calendar date for the given ISO year, week and day"
        year_start = iso_year_start(iso_year)
        return year_start + datetime.timedelta(days=iso_day-1, weeks=iso_week-1)
    

    몇 가지 테스트 사례 :

    >>> iso = datetime.date(2005, 1, 1).isocalendar()
    >>> iso
    (2004, 53, 6)
    >>> iso_to_gregorian(*iso)
    datetime.date(2005, 1, 1)
    
    >>> iso = datetime.date(2010, 1, 4).isocalendar()    
    >>> iso
    (2010, 1, 1)
    >>> iso_to_gregorian(*iso)
    datetime.date(2010, 1, 4)
    
    >>> iso = datetime.date(2010, 1, 3).isocalendar()
    >>> iso
    (2009, 53, 7)
    >>> iso_to_gregorian(*iso)
    datetime.date(2010, 1, 3)
    
  2. ==============================

    2.

    import datetime
    
    def iso_to_gregorian(iso_year, iso_week, iso_day):
        "Gregorian calendar date for the given ISO year, week and day"
        fourth_jan = datetime.date(iso_year, 1, 4)
        _, fourth_jan_week, fourth_jan_day = fourth_jan.isocalendar()
        return fourth_jan + datetime.timedelta(days=iso_day-fourth_jan_day, weeks=iso_week-fourth_jan_week)
    

    이것은 @ BenJames의 아주 좋은 대답에서부터 수정되었습니다. 일년 중 첫날을 알 필요가 없습니다. 같은 ISO 연도와 그 날짜의 ISO 달력 주간 및 요일에 확실히있는 날짜의 예를 알면됩니다.

    Ben이 지적했듯이 1 월 4 일은 항상 같은 ISO 연도와 그레고리력 연도에 속하므로 1 월 4 일이 그 하나의 예일뿐입니다.

    주 수가 모두 같은 길이이기 때문에 원하는 날짜의 ISO와 두 양식에서 알고있는 날짜의 ISO 사이의 일 및 주를 빼고 그 일수와 주수를 더할 수 있습니다. (이 숫자가 양수인지 음수인지는 중요하지 않으므로 12 월 28 일과 같은 다른 '고정일'을 선택할 수 있습니다.)

    @JoSo가 지적했듯이 ISO 표준에 속하는 그레고리력의 첫 번째 날은 1 월 4 일이며 1 월 5 일이 아닙니다. 설명에서 알 수 있듯이 어떤 날짜가 기준점으로 선택 되든 상관 없지만 1 월 4 일을 선택하면이 선택이 덜 마술 적입니다.

  3. ==============================

    3.현재 Python 3.6 (현재 개발 중)에서 새로운 % G, % u 및 % V 지시문을 사용할 수 있습니다. 문제 12006 및 업데이트 된 설명서를 참조하십시오.

    현재 Python 3.6 (현재 개발 중)에서 새로운 % G, % u 및 % V 지시문을 사용할 수 있습니다. 문제 12006 및 업데이트 된 설명서를 참조하십시오.

    연도, 주 번호 및 요일 번호가있는 문자열을 사용하면 다음과 같이 날짜를 분석 할 수 있습니다.

    from datetime import date
    
    date.strptime('2002 01 1', '%G %V %u')
    

    또는 정수 입력을 가진 함수로서 :

    from datetime import date
    
    def date_from_isoweek(iso_year, iso_weeknumber, iso_weekday):
        return date.strptime(
            '{:04d} {:02d} {:d}'.format(iso_year, iso_weeknumber, iso_weekday),
            '%G %V %u')
    
  4. ==============================

    4.다음에 오는 사람들에게 Ben의 좋은 솔루션을 더 짧고 단순하게 표현한 버전이 필요합니다.

    다음에 오는 사람들에게 Ben의 좋은 솔루션을 더 짧고 단순하게 표현한 버전이 필요합니다.

    def iso_to_gregorian(iso_year, iso_week, iso_day):
        jan4 = datetime.date(iso_year, 1, 4)
        start = jan4 - datetime.timedelta(days=jan4.isoweekday()-1)
        return start + datetime.timedelta(weeks=iso_week-1, days=iso_day-1)
    
  5. ==============================

    5.Python 3.6부터 datetime.strptime ()은 % G, % V 및 % u 지시문을 지원하므로 datetime.strptime ( '2015 1 2', '% G % V % u')을 간단히 수행 할 수 있습니다. ). 참조 : https://hg.python.org/cpython/rev/acdebfbfbdcf

    Python 3.6부터 datetime.strptime ()은 % G, % V 및 % u 지시문을 지원하므로 datetime.strptime ( '2015 1 2', '% G % V % u')을 간단히 수행 할 수 있습니다. ). 참조 : https://hg.python.org/cpython/rev/acdebfbfbdcf

  6. ==============================

    6.% W는 ISO 주 (1-53)와 같지 않은 주 # (0-53)입니다. % W가 작동하지 않는 경우가 있습니다.

    % W는 ISO 주 (1-53)와 같지 않은 주 # (0-53)입니다. % W가 작동하지 않는 경우가 있습니다.

  7. ==============================

    7.수정 :이 무시, 가장자리 경우 고통입니다. 벤의 솔루션으로 이동하십시오.

    수정 :이 무시, 가장자리 경우 고통입니다. 벤의 솔루션으로 이동하십시오.

    좋습니다. 자세히 살펴보면 strptime에 % W 및 % w 매개 변수가 있다는 것을 알았습니다. 다음과 같이 작동합니다.

    def fromisocalendar(y,w,d):
       return datetime.strptime( "%04dW%02d-%d"%(y,w-1,d), "%YW%W-%w")
    

    몇 가지 문제점 : ISO 주 숫자는 1에서 시작하고 % W는 0에서 시작합니다. ISO 주일은 % w와 동일한 1 (월요일)부터 시작하므로 일요일은 아마 7 일이 아니라 0 일 필요가 있습니다. ...

  8. from https://stackoverflow.com/questions/304256/whats-the-best-way-to-find-the-inverse-of-datetime-isocalendar by cc-by-sa and MIT license