주어진 날짜 이후 첫 번째 월요일의 날짜 찾기
특정 날짜 (예 : 2011-07-02)가 주어지면 해당 날짜 이후의 다음 월요일 (또는 해당 문제의 평일) 날짜를 어떻게 찾을 수 있습니까?
import datetime
def next_weekday(d, weekday):
days_ahead = weekday - d.weekday()
if days_ahead <= 0: # Target day already happened this week
days_ahead += 7
return d + datetime.timedelta(days_ahead)
d = datetime.date(2011, 7, 2)
next_monday = next_weekday(d, 0) # 0 = Monday, 1=Tuesday, 2=Wednesday...
print(next_monday)
위의 약간 무거운 답변에 대한 간결하고 일반적인 대안이 있습니다.
# Returns the date of the next given weekday after
# the given date. For example, the date of next Monday.
# NB: if it IS the day we're looking for, this returns 0.
# consider then doing onDay(foo, day + 1).
onDay = lambda date, day: date + datetime.timedelta(days=(day-date.weekday()+7)%7)
시험
>>> dt = datetime(2011, 7, 2)
>>> dt + timedelta(days=(7 - dt.weekday()))
datetime.datetime(2011, 7, 4, 0, 0)
다음 월요일은 월요일 이후 7 일, 화요일 이후 6 일 등이며 Python의 datetime
유형은 monday를 0
, ..., sunday로 6
.
날짜 개체에 하루를 추가하기 시작하고 월요일이되면 중지 할 수 있습니다.
>>> d = datetime.date(2011, 7, 2)
>>> while d.weekday() != 0: #0 for monday
... d += datetime.timedelta(days=1)
...
>>> d
datetime.date(2011, 7, 4)
또 다른 간단하고 우아한 해결책은 판다 오프셋을 사용하는 것입니다.
데이트를 할 때 매우 유용하고 강력합니다.
-첫 번째 일요일을 원하는 경우 주파수를 freq = 'W-SUN'으로 수정하십시오.
-다음 일요일을 몇 개 원할 경우 오프셋을 변경하십시오.
-Pandas 오프셋을 사용하면 휴일을 무시하고 업무 일에만 사용할 수 있습니다.
apply 메서드를 사용하여 전체 DataFrame에이 메서드를 쉽게 적용 할 수도 있습니다.
# Getting the closest monday from a given date
closest_monday = pd.date_range(start=date, end=date + offsets.Day(6), freq='W-MON')[0]
# Adding a 'ClosestMonday' column with the closest monday for each row in a pandas df using apply
# Require you to have a 'Date' column in your df
def get_closest_monday(row):
return pd.date_range(start=row.Date, end=row.Date + offsets.Day(6), freq='W-MON')[0]
df['ClosestMonday'] = df.apply(lambda row: get_closest_monday(row), axis=1)
이것은 ring 내 계산의 예입니다 mod 7
.
import datetime
def next_day(given_date, weekday):
day_shift = (weekday - given_date.weekday()) % 7
return given_date + datetime.timedelta(days=day_shift)
now = datetime.date(2018, 4, 15) # sunday
names = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday',
'saturday', 'sunday']
for weekday in range(7):
print(names[weekday], next_day(now, weekday))
인쇄됩니다 :
monday 2018-04-16
tuesday 2018-04-17
wednesday 2018-04-18
thursday 2018-04-19
friday 2018-04-20
saturday 2018-04-21
sunday 2018-04-15
보시다시피 다음 월요일, 화요일, 수요일, 목요일 금요일 및 토요일에 올바르게 제공됩니다. 그리고 그것은 또한 2018-04-15
일요일 이라는 것을 이해하고 다음 일요일 대신 현재 일요일을 반환했습니다.
I'm sure you'll find this answer extremely helpful after 7 years ;-)
import datetime
d = datetime.date(2011, 7, 2)
while d.weekday() != 0:
d += datetime.timedelta(1)
weekday = 0 ## Monday
dt = datetime.datetime.now().replace(hour=0, minute=0, second=0) ## or any specific date
days_remaining = (weekday - dt.weekday() - 1) % 7 + 1
next_dt = dt + datetime.timedelta(days_remaining)
Another alternative uses rrule
from dateutil.rrule import rrule, WEEKLY, MO
from datetime import date
next_monday = rrule(freq=WEEKLY, dtstart=date.today(), byweekday=MO, count=1)[0]
rrule docs: https://dateutil.readthedocs.io/en/stable/rrule.html
This will give the first next Monday after given date:
import datetime
def get_next_monday(year, month, day):
date0 = datetime.date(year, month, day)
next_monday = date0 + datetime.timedelta(7 - date0.weekday() or 7)
return next_monday
print get_next_monday(2011, 7, 2)
print get_next_monday(2015, 8, 31)
print get_next_monday(2015, 9, 1)
2011-07-04
2015-09-07
2015-09-07
via list comprehension?
from datetime import *
[datetime.today()+timedelta(days=x) for x in range(0,7) if (datetime.today()+timedelta(days=x)).weekday() % 7 == 0]
(0 at the end is for next monday, returns current date when run on monday)
ReferenceURL : https://stackoverflow.com/questions/6558535/find-the-date-for-the-first-monday-after-a-given-a-date
'developer tip' 카테고리의 다른 글
단일 문자를 정수로 변환하는 방법 (0) | 2021.01.09 |
---|---|
TextBox 입력 제한을 정의하는 방법은 무엇입니까? (0) | 2021.01.09 |
Doctrine2 쿼리에서 제한 및 오프셋 사용 (0) | 2021.01.09 |
Kotlin에서 예상되는 예외 테스트 (0) | 2021.01.09 |
NUnit Assert.AreEqual DateTime 허용 오차 (0) | 2021.01.09 |