이전 달의 날짜/시간 개체 반환
시간 델타가 생성자에서 한 달 간의 인수가 있었다면 좋았을 것입니다.그러면 가장 간단한 방법은 무엇일까요?
편집: 저는 아래 지적된 것처럼 이것에 대해 너무 어렵게 생각하고 있지 않았습니다.제가 정말로 원했던 것은 지난 달의 어느 날이었습니다. 왜냐하면 결국에는 일 년과 월만 잡을 것이기 때문입니다.그렇다면 날짜/시간 객체가 주어지면, 이전 달에 해당하는 날짜/시간 객체를 반환하는 가장 간단한 방법은 무엇일까요?
타사 모듈(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
원래 질문을 "이전 달의 임의의 날짜/시간 개체"로 편집한 후에는 해당 달의 첫 번째 날짜에서 1일을 빼면 쉽게 할 수 있습니다.
from datetime import datetime, timedelta
def a_day_in_previous_month(dt):
return dt.replace(day=1) - timedelta(days=1)
사용해 보십시오.
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%100==0 or 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)
Edit Corrected(편집 수정됨)를 선택하여 해당 날짜도 처리합니다.
편집 더 간단한 계산을 가리키는 퍼즐의 답변을 참조하십시오.d
:
d = min(date.day, calendar.monthrange(y, m)[1])
벡터화된 판다 솔루션은 매우 간단합니다.
df['date'] - pd.DateOffset(months=1)
duncan의 답변에 대한 변형(평판이 부족하여 코멘트를 달 수 없음). calendar.month 범위를 사용하여 해당 달의 마지막 날의 계산을 크게 단순화합니다.
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)
Get Last Day of the Month in Python의 월 범위 정보
간단한 방법은 판다의 날짜 오프셋을 다음과 같이 사용하는 것이라고 생각합니다.
import pandas as pd
date_1 = pd.to_datetime("2013-03-31", format="%Y-%m-%d") - pd.DateOffset(months=1)
결과는 Timestamp 개체가 됩니다.
시간 델타가 생성자에서 한 달 간의 인수가 있었다면 좋았을 것입니다.그러면 가장 간단한 방법은 무엇일까요?
예를 들어, 3월 30일 날짜에서 한 달을 빼면 결과가 어떻게 되기를 원하십니까?그것은 달을 더하거나 빼는 것의 문제입니다: 달은 다른 길이를 가집니다!일부 응용 프로그램에서는 예외가 적절하고, 다른 응용 프로그램에서는 "전월의 마지막 날"을 사용해도 괜찮지만, 다른 응용 프로그램에서는 한 달을 뺀 후 한 달을 추가하는 것이 전체적으로 연산이 없는 것은 아닙니다!), 그러나 다른 응용 프로그램에서는 날짜 외에도 사실에 대한 표시를 유지하고 싶을 것입니다."저는 2월 28일을 말하고 있지만, 만약 그것이 존재한다면 2월 30일을 정말로 원할 것입니다." 그래서 그것에 한 달을 더 추가하거나 뺄 수 있습니다(그리고 후자는 분명히 데이터 플러스/다른 것을 보유하는 사용자 지정 클래스를 필요로 합니다).
모든 애플리케이션에 대해 허용 가능한 실제 솔루션은 있을 수 없으며, 귀하는 이 비참한 작업의 의미에 대한 특정 애플리케이션의 요구 사항을 알려주지 않았기 때문에 여기서 제공할 수 있는 더 이상의 도움은 없습니다.
원하는 날짜가 마지막 달의 어느 날이면 가장 간단한 방법은 현재 날짜에서 일 수를 빼는 것입니다. 이 날짜에는 이전 달의 마지막 날이 표시됩니다.
예를 들어, 다음 날짜로 시작합니다.
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2016, 5, 24)
현재 날짜의 날짜를 빼면 다음과 같습니다.
>>> last_day_previous_month = today - datetime.timedelta(days=today.day)
>>> last_day_previous_month
datetime.date(2016, 4, 30)
이 정도면 지난 달에 필요한 모든 날짜를 간소화할 수 있습니다.
그러나 이제는 시작한 날짜를 포함하여 해당 월의 모든 날짜를 얻을 수 있습니다(예: 한 달을 빼는 것과 거의 동일).
>>> same_day_last_month = last_day_previous_month.replace(day=today.day)
>>> same_day_last_month
datetime.date(2016, 4, 24)
물론 30일 월 31일이나 2월부터 누락된 날짜(윤년 관리)에 주의해야 하지만, 이 또한 쉽게 할 수 있습니다.
>>> a_date = datetime.date(2016, 3, 31)
>>> last_day_previous_month = a_date - datetime.timedelta(days=a_date.day)
>>> a_date_minus_month = (
... last_day_previous_month.replace(day=a_date.day)
... if a_date.day < last_day_previous_month.day
... else last_day_previous_month
... )
>>> a_date_minus_month
datetime.date(2016, 2, 29)
대부분의 사용 사례의 경우, 다음과 같습니다.
from datetime import date
current_date =date.today()
current_month = current_date.month
last_month = current_month - 1 if current_month != 1 else 12
today_a_month_ago = date(current_date.year, last_month, current_date.day)
그것이 제게는 가장 간단한 것 같습니다.
참고: @Nick의 코멘트에 따라 현재 달이 1월이면 작동할 수 있도록 마지막 줄에 두 번째 줄을 추가했습니다.
참고 2: 대부분의 경우, 현재 날짜가 특정 달의 31일이면 결과는 유효하지 않은 날짜가 됩니다. 이전 달은 31일(7월과 8월 제외)이 없기 때문입니다.
지난달의 마지막 날을 반환합니다.
>>> import datetime
>>> datetime.datetime.now() - datetime.timedelta(days=datetime.datetime.now().day)
datetime.datetime(2020, 9, 30, 14, 13, 15, 67582)
지난달과 같은 날짜를 반환합니다.
>>> x = datetime.datetime.now() - datetime.timedelta(days=datetime.datetime.now().day)
>>> x.replace(day=datetime.datetime.now().day)
datetime.datetime(2020, 9, 7, 14, 22, 14, 362421)
저는 이것을 10월 1일에 4분기가 시작되는 정부 회계 연도에 사용합니다.날짜를 25센트로 변환하고 실행 취소합니다.
import pandas as pd
df['Date'] = '1/1/2020'
df['Date'] = pd.to_datetime(df['Date']) #returns 2020-01-01
df['NewDate'] = df.Date - pd.DateOffset(months=3) #returns 2019-10-01 <---- answer
# For fun, change it to FY Quarter '2019Q4'
df['NewDate'] = df['NewDate'].dt.year.astype(str) + 'Q' + df['NewDate'].dt.quarter.astype(str)
# Convert '2019Q4' back to 2019-10-01
df['NewDate'] = pd.to_datetime(df.NewDate)
라이너 하나?
previous_month_date = (current_date - datetime.timedelta(days=current_date.day+1)).replace(day=current_date.day)
내가 방금 시도한 가장 간단한 방법
from datetime import datetime
from django.utils import timezone
current = timezone.now()
if current.month == 1:
month = 12
else:
month = current.month - 1
current = datetime(current.year, month, current.day)
여기 그것을 하기 위한 몇 가지 코드가 있습니다.저도 해본 적이 없어요
def add_one_month(t):
"""Return a `datetime.date` or `datetime.datetime` (as given) that is
one month earlier.
Note that the resultant day of the month might change if the following
month has fewer days:
>>> add_one_month(datetime.date(2010, 1, 31))
datetime.date(2010, 2, 28)
"""
import datetime
one_day = datetime.timedelta(days=1)
one_month_later = t + one_day
while one_month_later.month == t.month: # advance to start of next month
one_month_later += one_day
target_month = one_month_later.month
while one_month_later.day < t.day: # advance to appropriate day
one_month_later += one_day
if one_month_later.month != target_month: # gone too far
one_month_later -= one_day
break
return one_month_later
def subtract_one_month(t):
"""Return a `datetime.date` or `datetime.datetime` (as given) that is
one month later.
Note that the resultant day of the month might change if the following
month has fewer days:
>>> subtract_one_month(datetime.date(2010, 3, 31))
datetime.date(2010, 2, 28)
"""
import datetime
one_day = datetime.timedelta(days=1)
one_month_earlier = t - one_day
while one_month_earlier.month == t.month or one_month_earlier.day > t.day:
one_month_earlier -= one_day
return one_month_earlier
(년, 월) 튜플을 지정하면 월이 1-12 사이로 이동합니다.
>>> from datetime import datetime
>>> today = datetime.today()
>>> today
datetime.datetime(2010, 8, 6, 10, 15, 21, 310000)
>>> thismonth = today.year, today.month
>>> thismonth
(2010, 8)
>>> lastmonth = lambda (yr,mo): [(y,m+1) for y,m in (divmod((yr*12+mo-2), 12),)][0]
>>> lastmonth(thismonth)
(2010, 7)
>>> lastmonth( (2010,1) )
(2009, 12)
매년 12개월이 있다고 가정합니다.
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)
>>> month_sub(2015, 7, 1)
(2015, 6)
>>> month_sub(2015, 7, -1)
(2015, 8)
>>> month_sub(2015, 7, 13)
(2014, 6)
>>> month_sub(2015, 7, -14)
(2016, 9)
다음 코드를 사용하여 특정 날짜로부터 개월 전으로 돌아갑니다.
your_date = datetime.strptime(input_date, "%Y-%m-%d") #to convert date(2016-01-01) to timestamp
start_date=your_date #start from current date
#Calculate Month
for i in range(0,n): #n = number of months you need to go back
start_date=start_date.replace(day=1) #1st day of current month
start_date=start_date-timedelta(days=1) #last day of previous month
#Calculate Day
if(start_date.day>your_date.day):
start_date=start_date.replace(day=your_date.day)
print start_date
예: 입력일 = 28/12/2015의 경우 6개월 이전 날짜를 계산합니다.
MONG: 30일로 합니다.이 단계에서는 start_date를 2015년 6월 30일로 지정합니다.
월 계산 단계 후에는 필요한 월의 마지막 날이 표시됩니다.
II)날짜 계산: 조건 if(start_date.day>your_date.day)가 input_date에서 날짜가 필요한 달에 있는지 확인합니다.이것은 입력 날짜가 31일(또는 30일)이고 필요한 달이 31일(또는 2월의 경우 30일) 미만인 조건을 처리합니다.윤년 사건도 처리합니다(2월분).이 단계를 마치면 2015년 6월 28일 결과가 나옵니다.
이 조건이 충족되지 않으면 start_date는 이전 달의 마지막 날짜로 남아 있습니다.그래서 2015년 12월 31일을 입력 날짜로 지정하고 6개월 이전 날짜를 원하면 2015년 6월 30일을 지정합니다.
아래 주어진 함수를 사용하여 X월 전후의 날짜를 확인할 수 있습니다.
날짜/시간 가져오기 날짜부터 def next_month(given_date, month): yyyy = int(((given_date)).연도 * 12 + 지정된_날짜.월) + 월)/12)mm = int(((given_date)).연도 * 12 + 지정된_날짜.월) + 월)%12) mm == 0인 경우:yyyy - = 1mm = 12 반환 given_date.replace(year=yyyy, month=mm) if __name__ == "__main__": 오늘 = 날짜오늘 오후에인쇄(오늘) mm 단위 [-12, -1, 0, 1, 2, 12, 20]: next_date = next_month (오늘,mm)인쇄(다음 날짜)
저는 이 대답이 꽤 읽을 만하다고 생각합니다.
def month_delta(dt, delta):
year_delta, month = divmod(dt.month + delta, 12)
if month == 0:
# convert a 0 to december
month = 12
if delta < 0:
# if moving backwards, then it's december of last year
year_delta -= 1
year = dt.year + year_delta
return dt.replace(month=month, year=year)
for delta in range(-20, 21):
print(delta, "->", month_delta(datetime(2011, 1, 1), delta))
-20 -> 2009-05-01 00:00:00
-19 -> 2009-06-01 00:00:00
-18 -> 2009-07-01 00:00:00
-17 -> 2009-08-01 00:00:00
-16 -> 2009-09-01 00:00:00
-15 -> 2009-10-01 00:00:00
-14 -> 2009-11-01 00:00:00
-13 -> 2009-12-01 00:00:00
-12 -> 2010-01-01 00:00:00
-11 -> 2010-02-01 00:00:00
-10 -> 2010-03-01 00:00:00
-9 -> 2010-04-01 00:00:00
-8 -> 2010-05-01 00:00:00
-7 -> 2010-06-01 00:00:00
-6 -> 2010-07-01 00:00:00
-5 -> 2010-08-01 00:00:00
-4 -> 2010-09-01 00:00:00
-3 -> 2010-10-01 00:00:00
-2 -> 2010-11-01 00:00:00
-1 -> 2010-12-01 00:00:00
0 -> 2011-01-01 00:00:00
1 -> 2011-02-01 00:00:00
2 -> 2011-03-01 00:00:00
3 -> 2011-04-01 00:00:00
4 -> 2011-05-01 00:00:00
5 -> 2011-06-01 00:00:00
6 -> 2011-07-01 00:00:00
7 -> 2011-08-01 00:00:00
8 -> 2011-09-01 00:00:00
9 -> 2011-10-01 00:00:00
10 -> 2011-11-01 00:00:00
11 -> 2012-12-01 00:00:00
12 -> 2012-01-01 00:00:00
13 -> 2012-02-01 00:00:00
14 -> 2012-03-01 00:00:00
15 -> 2012-04-01 00:00:00
16 -> 2012-05-01 00:00:00
17 -> 2012-06-01 00:00:00
18 -> 2012-07-01 00:00:00
19 -> 2012-08-01 00:00:00
20 -> 2012-09-01 00:00:00
얼마 전에 저는 다음 알고리즘을 발견했는데, 이 알고리즘은 두 가지 중 하나에서 달을 늘리고 줄이는 데 매우 잘 작동합니다.date
또는datetime
.
주의: 다음과 같은 경우 실패합니다.day
새 달에는 사용할 수 없습니다.나는 이것을 날짜 객체에 사용합니다.day == 1
항상.
파이썬 3.x:
def increment_month(d, add=1):
return date(d.year+(d.month+add-1)//12, (d.month+add-1) % 12+1, 1)
Python 2.7의 경우,//12
정당하게/12
정수 나눗셈이 포함되어 있기 때문입니다.
최근에 스크립트가 다음과 같은 유용한 전역을 가져오기 시작했을 때 기본 파일에서 사용했습니다.
MONTH_THIS = datetime.date.today()
MONTH_THIS = datetime.date(MONTH_THIS.year, MONTH_THIS.month, 1)
MONTH_1AGO = datetime.date(MONTH_THIS.year+(MONTH_THIS.month-2)//12,
(MONTH_THIS.month-2) % 12+1, 1)
MONTH_2AGO = datetime.date(MONTH_THIS.year+(MONTH_THIS.month-3)//12,
(MONTH_THIS.month-3) % 12+1, 1)
다음 방법을 사용하여 "n_months"개월을 datetime 개체로 뺄셈했습니다.
from datetime import datetime, timedelta
def substract_months(original_date: datetime, n_months:int) -> datetime:
ref_date = original_date
for i in range(0, number_of_months):
ref_date = (ref_date.replace(day=1) - timedelta(days=1)).replace(day=1)
ref_date = ref_date.replace(day=original_date.day)
return ref_date
다음과 같이 사용할 수 있습니다.
print(substract_months(original_date=datetime(2022, 11, 16), number_of_months=2))
다음을 반환합니다.
2022-09-16 00:00:00
import datetime
date_str = '08/01/2018'
format_str = '%d/%m/%Y'
datetime_obj = datetime.datetime.strptime(date_str, format_str)
datetime_obj.replace(month=datetime_obj.month-1)
간단한 솔루션으로 특별한 라이브러리가 필요하지 않습니다.
다음과 같이 두 줄로 나눌 수 있습니다.
now = datetime.now()
last_month = datetime(now.year, now.month - 1, now.day)
수입품을 기억하고 있습니다.
from datetime import datetime
언급URL : https://stackoverflow.com/questions/3424899/return-datetime-object-of-previous-month
'source' 카테고리의 다른 글
Console Service Discovery를 통한 자동 프록시 서비스 (0) | 2023.07.21 |
---|---|
판다 데이터 프레임의 사용자 지정 정렬 (0) | 2023.07.16 |
탐색 기능? (0) | 2023.07.16 |
Python을 사용하여 sqlite3 데이터베이스 테이블로 CSV 파일 가져오기 (0) | 2023.07.16 |
LAN을 통해 Visual Studio 디버깅 IIS Express 서버에 연결하는 중 (0) | 2023.07.16 |