복붙노트

[PYTHON] 파이썬 : 달의 차이 2 datetimes [duplicate]

PYTHON

파이썬 : 달의 차이 2 datetimes [duplicate]

이 차이에 대해 정확한 개월 수를 알고 싶습니다.

date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S')
date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d')

date2-date1 결과 표시

datetime.timedelta(183, 43200)

정확한 개월 수를 알고 싶습니다.이 경우 5가 아니라 6을 반환해야합니다 (시간 때문에).

해결법

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

    1.캘린더 모듈을 사용하여 매월 몇 일 동안 있는지 알아 내면 몇 달을 계산할 수 있습니다.

    캘린더 모듈을 사용하여 매월 몇 일 동안 있는지 알아 내면 몇 달을 계산할 수 있습니다.

    from calendar import monthrange
    from datetime import datetime, timedelta
    
    def monthdelta(d1, d2):
        delta = 0
        while True:
            mdays = monthrange(d1.year, d1.month)[1]
            d1 += timedelta(days=mdays)
            if d1 <= d2:
                delta += 1
            else:
                break
        return delta
    
  2. ==============================

    2.python-dateutil을 사용할 수 있습니다.

    python-dateutil을 사용할 수 있습니다.

    In [4]: from datetime import datetime
    
    In [5]: date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S')
    
    In [6]: date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d')
    
    In [7]: from dateutil import relativedelta
    
    In [8]: r = relativedelta.relativedelta(date1, date2)
    
    In [9]: r
    Out[9]: relativedelta(months=-5, days=-30, hours=-12)
    
  3. ==============================

    3.단지 당신이 만날해야하는 요구 사항을 알고 있지만이 두 날짜 사이에 183 일 및 43200 초가 있다는 사실은 "실제로"몇 달이 걸렸는지를 결정하는 고유 한 주관성을 강조합니다.

    단지 당신이 만날해야하는 요구 사항을 알고 있지만이 두 날짜 사이에 183 일 및 43200 초가 있다는 사실은 "실제로"몇 달이 걸렸는지를 결정하는 고유 한 주관성을 강조합니다.

    30 일 또는 (365 / 12) 일 또는 ((365 * 4 + 1) / 48) 일입니까, 아니면 ...입니까?

    하루가 항상 86400 초입니까? 아니면 역사적인 도약 초를 계산합니까, 아니면 미래의 도약 시간을 예측합니까?

    이러한 결정은 원하는 알고리즘이 이러한 경계에 가까운 특정 입력 날짜에 대한 대답을 줄 수 있습니다.

    필자의 의견으로는이 목적을 위해 월을 원자 단위로 간주하고이 수식을 사용하는 것이 더 직관적입니다. (date2.year - date1.year) * 12 + (date2.month - date1.month)

  4. ==============================

    4.이런 식으로하는 것의 장점은 모듈 의존성이 거의없고 루핑이 없다는 것입니다. 바로 계산을 통해 월을 찾을 수 있습니다.

    이런 식으로하는 것의 장점은 모듈 의존성이 거의없고 루핑이 없다는 것입니다. 바로 계산을 통해 월을 찾을 수 있습니다.

    import datetime as dt
    
    def months_between(date1,date2):
        if date1>date2:
            date1,date2=date2,date1
        m1=date1.year*12+date1.month
        m2=date2.year*12+date2.month
        months=m2-m1
        if date1.day>date2.day:
            months-=1
        elif date1.day==date2.day:
            seconds1=date1.hour*3600+date1.minute+date1.second
            seconds2=date2.hour*3600+date2.minute+date2.second
            if seconds1>seconds2:
                months-=1
        return months
    
    date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S')
    date2 = dt.datetime.strptime('2012-02-15', '%Y-%m-%d')
    print(months_between(date1,date2))
    # 5
    
    date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S')
    date2 = dt.datetime.strptime('2012-02-15 11:59:00', '%Y-%m-%d %X')
    print(months_between(date1,date2))
    # 5
    
    date2 = dt.datetime.strptime('2012-02-15 12:00:00', '%Y-%m-%d %X')
    print(months_between(date1,date2))
    # 6
    
    date2 = dt.datetime.strptime('2012-02-15 12:00:01', '%Y-%m-%d %X')
    print(months_between(date1,date2))
    # 6
    
  5. from https://stackoverflow.com/questions/7015587/python-difference-of-2-datetimes-in-months by cc-by-sa and MIT license