timedelta 만 생성자에 월 인수가있는 경우. 그래서 이것을하는 가장 간단한 방법은 무엇입니까?
편집 : 나는 아래에서 지적한 것처럼 이것에 대해 너무 열심히 생각하지 않았습니다. 정말로 내가 원했던 것은 지난 달의 어느 날이든 결국은 년과 달만 잡을 것이기 때문입니다. 따라서 datetime 객체가 주어지면 이전 달에 해당하는 datetime 객체 를 반환하는 가장 간단한 방법은 무엇 입니까?
답변
이 시도:
def monthdelta(date, delta):
m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
if not m: m = 12
d = min(date.day, [31,
29 if y%4==0 and not y%400==0 else 28,31,30,31,30,31,31,30,31,30,31][m-1])
return date.replace(day=d,month=m, year=y)
>>> for m in range(-12, 12):
print(monthdelta(datetime.now(), m))
2009-08-06 16:12:27.823000
2009-09-06 16:12:27.855000
2009-10-06 16:12:27.870000
2009-11-06 16:12:27.870000
2009-12-06 16:12:27.870000
2010-01-06 16:12:27.870000
2010-02-06 16:12:27.870000
2010-03-06 16:12:27.886000
2010-04-06 16:12:27.886000
2010-05-06 16:12:27.886000
2010-06-06 16:12:27.886000
2010-07-06 16:12:27.886000
2010-08-06 16:12:27.901000
2010-09-06 16:12:27.901000
2010-10-06 16:12:27.901000
2010-11-06 16:12:27.901000
2010-12-06 16:12:27.901000
2011-01-06 16:12:27.917000
2011-02-06 16:12:27.917000
2011-03-06 16:12:27.917000
2011-04-06 16:12:27.917000
2011-05-06 16:12:27.917000
2011-06-06 16:12:27.933000
2011-07-06 16:12:27.933000
>>> monthdelta(datetime(2010,3,30), -1)
datetime.datetime(2010, 2, 28, 0, 0)
>>> monthdelta(datetime(2008,3,30), -1)
datetime.datetime(2008, 2, 29, 0, 0)
편집 날짜도 처리하도록 수정 되었습니다.
편집 더 간단한 계산을 지적하는 의문의 답을 참조하십시오 d
.
d = min(date.day, calendar.monthrange(y, m)[1])
답변
타사 dateutil
모듈을 사용할 수 있습니다 ( 여기에 PyPI 항목 ).
import datetime
import dateutil.relativedelta
d = datetime.datetime.strptime("2013-03-31", "%Y-%m-%d")
d2 = d - dateutil.relativedelta.relativedelta(months=1)
print d2
산출:
2013-02-28 00:00:00
답변
원래 질문을 “전월의 모든 datetime 객체”로 편집 한 후 해당 월의 1 일에서 1 일을 빼면 매우 쉽게 수행 할 수 있습니다.
from datetime import datetime, timedelta
def a_day_in_previous_month(dt):
return dt.replace(day=1) - timedelta(days=1)
답변
Duncan의 답변 에 대한 변형 (댓글 할만한 평판이 충분하지 않음)은 calendar.monthrange를 사용하여 해당 월의 마지막 날 계산을 극적으로 단순화합니다.
import calendar
def monthdelta(date, delta):
m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
if not m: m = 12
d = min(date.day, calendar.monthrange(y, m)[1])
return date.replace(day=d,month=m, year=y)
Python에서 이달의 마지막 날 가져 오기의 월간 정보
답변
벡터화 된 pandas 솔루션은 매우 간단합니다.
df['date'] - pd.DateOffset(months=1)
답변
timedelta 만 생성자에 월 인수가있는 경우. 그래서 이것을하는 가장 간단한 방법은 무엇입니까?
예를 들어 3 월 30 일 날짜에서 한 달을 빼면 결과가 어떻게됩니까? 이것이 달을 더하거나 빼는 문제입니다. 달은 길이가 다릅니다! 어떤 경우에는 예외가 적절하고 다른 경우에는 “이전 달의 마지막 날”을 사용해도 괜찮습니다 (하지만 한 달을 뺀 다음 한 달을 더하는 것이 전체적으로 작동하지 않는 것은 아닙니다 !). , 다른 경우에는 날짜 외에도 사실에 대한 몇 가지 표시를 유지하고 싶을 것입니다. 예를 들어 “2 월 28 일을 말하고 있지만 2 월 30 일이 존재한다면 정말로 원할 것입니다.” 그것은 다시 일을 바로 잡을 수 있습니다 (그리고 후자는 분명히 데이터와 s / thing 다른 것을 포함하는 커스텀 클래스를 필요로합니다).
모든 애플리케이션에 허용되는 실제 솔루션은있을 수 없으며,이 비참한 작업의 의미에 대한 특정 앱의 요구 사항을 알려주지 않았으므로 여기에서 제공 할 수있는 더 많은 도움이 없습니다.
답변
간단한 방법은 Pandas의 DateOffset을 다음과 같이 사용하는 것입니다.
import pandas as pd
date_1 = pd.to_datetime("2013-03-31", format="%Y-%m-%d") - pd.DateOffset(months=1)
결과는 datetime 객체가됩니다.