라이브러리를 사용하지 않고 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
편집 - 다음 달에 날짜가 적은 경우 반올림해야 하는 날짜에 대한 의견을 바탕으로 다음과 같은 해결 방법을 제시합니다.
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)
시간,분, 한, ,, ,, ,, ,, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면, 면면,date
datetime
분, 되면 내 를 수정하여 , 몇, 가, 가를 사용해야 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
'programing' 카테고리의 다른 글
오류 2003(HY000):'127.0.0.1'(111)의 MySQL 서버에 연결할 수 없습니다. (0) | 2022.10.30 |
---|---|
lodash를 사용하여 개체에서 정의되지 않은 값과 null 값을 제거하려면 어떻게 해야 합니까? (0) | 2022.10.30 |
String 객체를 Boolean 객체로 변환하는 방법 (0) | 2022.10.30 |
MySQL/MariaDB: 케이스 스테이트먼트를 사용하여 프로시저를 만들 수 없습니다. (0) | 2022.10.30 |
SQL 쿼리를 JSON 형식의 텍스트 파일로 내보내기 (0) | 2022.10.21 |