2011-07-02 115 views
33

对于一个特定的日期后,说2011-07-02,我怎么能找到下一个星期一(或与此有关的任何工作日天)在该日期之后的日期?查找第一个星期一的日期指定的日期

+2

http://docs.python.org/library/datetime.html#datetime.date.weekday –

回答

74
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) 
+6

你也可以做'((日 - 今天)+ 7)%7'得到这一天diff – jstaab

+2

我认为只是'(日 - 今天)%7'应该做的窍门 – bsa

18

使用尝试

>>> dt = datetime(2011, 7, 2) 
>>> dt + timedelta(days=(7 - dt.weekday())) 
datetime.datetime(2011, 7, 4, 0, 0) 

,那接下来的星期一是一个星期一后的7天,周二后6天,依此类推,并且还使用的是Python的datetime类型报告周一0,...,星期日为6

+0

有趣的是 - 当我试图找到日期时间后(2013,1,1)与 “日期时间(2013,1 ,1)+ timedelta(days =(7 - datetime(2013,1,1).weekday()))“,我得到”datetime.datetime(2013,1,7,0,0)“,这是一个星期一。 – fixxxer

+0

@fixxxer - 正如它在答案中所说:代码使用'datetime' API的一些属性,只有在寻找星期一的时候才会起作用。由'phihag'提供的代码更一般,可以找到任何即将到来的星期几。 – Dirk

+0

你觉得在timedelta中使用6而不是7会有帮助吗? – fixxxer

3

您可以开始添加一天的日期对象和停止时,它的星期一。

>>> d = datetime.date(2011, 7, 2) 
>>> while d.weekday() != 0: #0 for monday 
...  d += datetime.timedelta(days=1) 
... 
>>> d 
datetime.date(2011, 7, 4) 
-2

这将给第一下星期一发出后日期:

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年9月7日
2015年9月7日

-1

通过名单理解?

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) 
0
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) 
15

这里有一个简洁和通用的替代上面稍微有分量的答案。

# Returns the date of the next given weekday after 
# the given date. For example, the date of next Monday. 
onDay = lambda date, day: date + datetime.timedelta(days=(day-date.weekday()+7)%7) 
+0

这个答案来得太晚而无法收集投票,​​但这是我的最爱。 – ASalazar

+1

非常干净,你有我的投票。 – Liquidgenius

1

另一个简单优雅的解决方案是使用熊猫补偿。
我发现它在玩日期时非常有帮助和强大。
- 如果你想第一个星期日只需修改到频率=“W-SUN”的频率。
- 如果你想要一对夫妇下一个星期天,改变offsets.Day(天)。
- 使用大熊猫偏移让你忽视假期,只有工作日和更多的工作。
您还可以使用应用方法的整个数据框轻松地应用这种方法。

# 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) 
2
import datetime 

d = datetime.date(2011, 7, 2) 
while d.weekday() != 0: 
    d += datetime.timedelta(1) 
相关问题