programing

라이브러리를 사용하지 않고 python에서 datetime을 사용자 지정 개월 단위로 늘리는 방법

goodsources 2022. 10. 30. 11:12
반응형

라이브러리를 사용하지 않고 python에서 datetime을 사용자 지정 개월 단위로 늘리는 방법

날짜/시간 값의 월을 늘려야 합니다.

next_month = datetime.datetime(mydate.year, mydate.month+1, 1)

달이 12일 때 13이 되고 "month must be in 1 . 12" 오류가 발생합니다(연도가 증가할 것으로 예상했습니다).

timedelta를 사용하고 싶었지만 month 인수가 필요 없습니다.relative libedelta python 패키지는 있습니다만, 이것만으로 설치하고 싶은 것은 아닙니다.strtotime을 이용한 해결책도 있다.

time = strtotime(str(mydate));
next_month = date("Y-m-d", strtotime("+1 month", time));

datetime에서 str, time, datetime으로 변환하고 싶지 않습니다.따라서 아직 라이브러리입니다.

timedelta를 사용하는 것 같은 간단하고 좋은 솔루션을 가지고 있는 사람이 있습니까?

이것은 dateutil's를 사용하여 날짜에 한 달을 추가하는 짧고 달콤한 방법입니다.

from datetime import datetime
from dateutil.relativedelta import relativedelta
    
date_after_month = datetime.today()+ relativedelta(months=1)
print('Today: ',datetime.today().strftime('%d/%m/%Y'))
print('After Month:', date_after_month.strftime('%d/%m/%Y'))
Today:  01/03/2013

After Month: 01/04/2013

경고 한마디:relativedelta(months=1) ★★★★★★★★★★★★★★★★★」relativedelta(month=1)다른 의미를 가지다패스month=1원래 날짜의 달을 1월로 대체하지만, 통과하면months=1원래 날짜에 한 달이 추가됩니다.

이 에는 ": " " 가 필요합니다.python-dateutil하고 있는 인스톨 , 로 이 .Linux 를 사용하고 있는 경우는, 인스톨 하려면 , 터미널에서 이 커맨드를 실행할 필요가 있습니다.

sudo apt-get update && sudo apt-get install python-dateutil

설명: python으로 월 값을 추가합니다.

편집 - 다음 달에 날짜가 적은 경우 반올림해야 하는 날짜에 대한 의견을 바탕으로 다음과 같은 해결 방법을 제시합니다.

import datetime
import calendar

def add_months(sourcedate, months):
    month = sourcedate.month - 1 + months
    year = sourcedate.year + month // 12
    month = month % 12 + 1
    day = min(sourcedate.day, calendar.monthrange(year,month)[1])
    return datetime.date(year, month, day)

사용 중:

>>> somedate = datetime.date.today()
>>> somedate
datetime.date(2010, 11, 9)
>>> add_months(somedate,1)
datetime.date(2010, 12, 9)
>>> add_months(somedate,23)
datetime.date(2012, 10, 9)
>>> otherdate = datetime.date(2010,10,31)
>>> add_months(otherdate,1)
datetime.date(2010, 11, 30)

시간,분, 한, ,, ,, ,, ,, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면면,datedatetime분, 되면 내 를 수정하여 , 몇, 가, 가를 사용해야 datetime소스로부터 결과에 시간, 분, 초를 카피합니다.

소금 여기 있습니다.

current = datetime.datetime(mydate.year, mydate.month, 1)
next_month = datetime.datetime(mydate.year + int(mydate.month / 12), ((mydate.month % 12) + 1), 1)

쉽고 빠르게 :)

아무도 해결책을 제시하지 않았기 때문에, 내가 지금까지 해결한 방법은 다음과 같다.

year, month= divmod(mydate.month+1, 12)
if month == 0: 
      month = 12
      year = year -1
next_month = datetime.datetime(mydate.year + year, month, 1)

monthdelta 패키지를 사용하면 timedelta와 동일하게 동작하지만, 일/시간 등이 아닌 달력에 대해서만 동작합니다.

다음은 예를 제시하겠습니다.

from monthdelta import MonthDelta

def prev_month(date):
    """Back one month and preserve day if possible"""
    return date + MonthDelta(-1)

이를 DIY 접근법과 비교해 보십시오.

def prev_month(date):
    """Back one month and preserve day if possible"""
   day_of_month = date.day
   if day_of_month != 1:
           date = date.replace(day=1)
   date -= datetime.timedelta(days=1)
   while True:
           try:
                   date = date.replace(day=day_of_month)
                   return date
           except ValueError:
                   day_of_month -= 1               
from datetime import timedelta
try:
    next = (x.replace(day=1) + timedelta(days=31)).replace(day=x.day)
except ValueError:  # January 31 will return last day of February.
    next = (x + timedelta(days=31)).replace(day=1) - timedelta(days=1)

단순히 다음 달 첫째 날을 원하는 경우:

next = (x.replace(day=1) + timedelta(days=31)).replace(day=1)

현재, 이전 및 다음 달을 계산하려면:

import datetime
this_month = datetime.date.today().month
last_month = datetime.date.today().month - 1 or 12
next_month = (datetime.date.today().month + 1) % 12 or 12

calendar.monthrange()를 사용하여 현재 달의 일수를 추가해도 될까요?

import calendar, datetime

def increment_month(when):
    days = calendar.monthrange(when.year, when.month)[1]
    return when + datetime.timedelta(days=days)

now = datetime.datetime.now()
print 'It is now %s' % now
print 'In a month, it will be %s' % increment_month(now)

Dave Webb의 솔루션과 이상적으로는 비슷하지만 까다로운 모듈로 계산은 모두 생략되어 있습니다.

import datetime, calendar

def increment_month(date):
    # Go to first of this month, and add 32 days to get to the next month
    next_month = date.replace(day=1) + datetime.timedelta(32)
    # Get the day of month that corresponds
    day = min(date.day, calendar.monthrange(next_month.year, next_month.month)[1])
    return next_month.replace(day=day)

이거 어때요?(추가 라이브러리는 필요 없습니다)

from datetime import date, timedelta
from calendar import monthrange

today = date.today()
month_later = date(today.year, today.month, monthrange(today.year, today.month)[1]) + timedelta(1)

가장 간단한 해결책은 월말에 가서(월에는 적어도 28일이 있다는 것을 항상 알고 있습니다) 다음 나방으로 이동하기에 충분한 날짜를 추가하는 것입니다.

>>> from datetime import datetime, timedelta
>>> today = datetime.today()
>>> today
datetime.datetime(2014, 4, 30, 11, 47, 27, 811253)
>>> (today.replace(day=28) + timedelta(days=10)).replace(day=today.day)
datetime.datetime(2014, 5, 30, 11, 47, 27, 811253)

또, 연차에도 대응:

>>> dec31
datetime.datetime(2015, 12, 31, 11, 47, 27, 811253)
>>> today = dec31
>>> (today.replace(day=28) + timedelta(days=10)).replace(day=today.day)
datetime.datetime(2016, 1, 31, 11, 47, 27, 811253)

예를 들어, 1월 31일에서 2월 31일로 이동하는 경우, 다음 달에도 같은 날이 발생한다는 보장은 없습니다.

>>> today
datetime.datetime(2016, 1, 31, 11, 47, 27, 811253)
>>> (today.replace(day=28) + timedelta(days=10)).replace(day=today.day)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: day is out of range for month

따라서 다음 달에는 항상 1일이 있다는 것을 알고 있기 때문에 다음 달 1일로 이동해야 하는 경우에는 이 솔루션이 유효합니다..replace(day=1)그렇지 않은 경우 사용 가능한 마지막 날로 이동하려면 다음 명령을 사용합니다.

>>> today
datetime.datetime(2016, 1, 31, 11, 47, 27, 811253)
>>> next_month = (today.replace(day=28) + timedelta(days=10))
>>> import calendar
>>> next_month.replace(day=min(today.day, 
                               calendar.monthrange(next_month.year, next_month.month)[1]))
datetime.datetime(2016, 2, 29, 11, 47, 27, 811253)

이 실장은 과금을 취급하고 있는 사람에게 도움이 될 수 있습니다.

청구서를 취급하고 있는 경우는, 「1년의 1/12를 추가하는 것」이 아니고, 「다음 달과 같은 날짜(가능한 경우)」를 취득하는 것이 좋습니다.

이 작업을 지속적으로 수행할 경우 실제로 두 가지 값을 고려해야 합니다.그렇지 않으면 27일 이후의 날짜에 대해 윤년이 지난 27일이 될 때까지 며칠을 계속 잃게 됩니다.

고려해야 할 값은 다음과 같습니다.

  • 월을 추가할 값
  • 네가 시작한 날

이렇게 하면 31일부터 30일까지 1개월을 더하면 해당 날이 있는 다음 달에는 31일로 다시 올라갑니다.

저는 이렇게 했습니다.

def closest_date_next_month(year, month, day):
    month = month + 1
    if month == 13:
        month = 1
        year  = year + 1


    condition = True
    while condition:
        try:
            return datetime.datetime(year, month, day)
        except ValueError:
            day = day-1
        condition = day > 26

    raise Exception('Problem getting date next month')

paid_until = closest_date_next_month(
                 last_paid_until.year, 
                 last_paid_until.month, 
                 original_purchase_date.day)  # The trick is here, I'm using the original date, that I started adding from, not the last one

몇 가지 수정사항과 timedelta를 사용해 보겠습니다.

from datetime import datetime, timedelta


def inc_date(origin_date):
    day = origin_date.day
    month = origin_date.month
    year = origin_date.year
    if origin_date.month == 12:
        delta = datetime(year + 1, 1, day) - origin_date
    else:
        delta = datetime(year, month + 1, day) - origin_date
    return origin_date + delta

final_date = inc_date(datetime.today())
print final_date.date()

다음 달 1일의 날짜를 찾는 것과 관련된 문제를 특정 날짜에 관계없이 해결하고 싶었습니다.이것은 1개월 후의 같은 날이 아닙니다.

따라서 2014년 12월 12일(또는 12월 중 어느 날)에 제출하고 2015년 1월 1일에 반환하는 것만 원하는 경우 다음과 같이 하십시오.

import datetime

def get_next_month(date):
    month = (date.month % 12) + 1
    year = date.year + (date.month + 1 > 12)
    return datetime.datetime(year, month, 1)

달력을 사용하지 않는 솔루션:

def add_month_year(date, years=0, months=0):
    year, month = date.year + years, date.month + months + 1
    dyear, month = divmod(month - 1, 12)
    rdate = datetime.date(year + dyear, month + 1, 1) - datetime.timedelta(1)
    return rdate.replace(day = min(rdate.day, date.day))
def add_month(d,n=1): return type(d)(d.year+(d.month+n-1)/12, (d.month+n-1)%12+1, 1)

이것만 사용:

import datetime
today = datetime.datetime.today()
nextMonthDatetime = today + datetime.timedelta(days=(today.max.day - today.day)+1)

이게 내가 생각해낸 거야

from calendar  import monthrange

def same_day_months_after(start_date, months=1):
    target_year = start_date.year + ((start_date.month + months) / 12)
    target_month = (start_date.month + months) % 12
    num_days_target_month = monthrange(target_year, target_month)[1]
    return start_date.replace(year=target_year, month=target_month, 
        day=min(start_date.day, num_days_target_month))
def month_sub(year, month, sub_month):
    result_month = 0
    result_year = 0
    if month > (sub_month % 12):
        result_month = month - (sub_month % 12)
        result_year = year - (sub_month / 12)
    else:
        result_month = 12 - (sub_month % 12) + month
        result_year = year - (sub_month / 12 + 1)
    return (result_year, result_month)

def month_add(year, month, add_month):
    return month_sub(year, month, -add_month)

>>> month_add(2015, 7, 1)                        
(2015, 8)
>>> month_add(2015, 7, 20)
(2017, 3)
>>> month_add(2015, 7, 12)
(2016, 7)
>>> month_add(2015, 7, 24)
(2017, 7)
>>> month_add(2015, 7, -2)
(2015, 5)
>>> month_add(2015, 7, -12)
(2014, 7)
>>> month_add(2015, 7, -13)
(2014, 6)

time 객체를 사용한 예:

start_time = time.gmtime(time.time())    # start now

#increment one month
start_time = time.gmtime(time.mktime([start_time.tm_year, start_time.tm_mon+1, start_time.tm_mday, start_time.tm_hour, start_time.tm_min, start_time.tm_sec, 0, 0, 0]))

모듈을 추가할 필요가 없는 매우 간단한 솔루션:

def addmonth(date):
    if date.day < 20:
        date2 = date+timedelta(32)
    else :
        date2 = date+timedelta(25)
    date2.replace(date2.year, date2.month, day)
    return date2

언급URL : https://stackoverflow.com/questions/4130922/how-to-increment-datetime-by-custom-months-in-python-without-using-library

반응형