2011-07-02 39 views

Trả lời

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

Bạn cũng có thể làm '((ngày - hôm nay) + 7)% 7' để có được ngày khác biệt – jstaab

+2

Tôi nghĩ rằng chỉ '(ngày - hôm nay)% 7' nên làm thủ thuật – bsa

18

Hãy thử

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

sử dụng, rằng thứ hai tiếp theo là 7 ngày sau khi một thứ hai, 6 ngày sau khi một thứ ba, và như vậy, và cũng có thể sử dụng, đó là Python của datetime loại báo cáo thứ hai là 0, ..., chủ nhật là 6.

+0

Thú vị là - khi tôi cố gắng tìm Chủ nhật sắp tới sau ngày giờ (2013, 1, 1) với " datetime (2013, 1 , 1) + timedelta (ngày = (7 - datetime (2013, 1, 1) .weekday())) ", tôi nhận được" datetime.datetime (2013, 1, 7, 0, 0) ", là thứ hai . – fixxxer

+0

@fixxxer - Như nó nói trong câu trả lời: mã sử dụng một vài thuộc tính của API 'datetime' theo cách, mà sẽ chỉ hoạt động, nếu bạn đang tìm kiếm thứ hai. Mã được cung cấp bởi 'phihag' tổng quát hơn và có thể tìm thấy bất kỳ ngày nào trong tuần sắp tới. – Dirk

+0

Bạn có nghĩ rằng việc sử dụng 6 thay vì 7 trong timedelta sẽ giúp ích? – fixxxer

3

Bạn có thể bắt đầu thêm một ngày vào đối tượng ngày và dừng khi thứ hai.

>>> 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

này sẽ cung cấp cho các đầu tiên vào thứ hai tới ngày sau khi đưa ra:

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

-1

qua danh sách bao quát?

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

Dưới đây là một lựa chọn ngắn gọn và tổng quát để câu trả lời hơi nặng ở trên.

# 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

Câu trả lời này đến quá muộn để thu thập upvotes, nhưng nó là yêu thích của tôi. – ASalazar

+1

Vô cùng sạch sẽ, bạn có phiếu bầu của tôi. – Liquidgenius

1

Một giải pháp đơn giản khác là sử dụng bù lệch con gấu trúc.
Tôi thấy nó rất hữu ích và mạnh mẽ khi chơi cùng với ngày tháng.
- Nếu bạn muốn chủ nhật đầu tiên chỉ sửa đổi tần số thành freq = 'W-SUN'.
- Nếu bạn muốn một vài chủ nhật tiếp theo, hãy thay đổi offsets.Day (ngày).
- Sử dụng bù trừ gấu trúc cho phép bạn bỏ qua ngày lễ, chỉ hoạt động với Ngày làm việc và hơn thế nữa.
Bạn cũng có thể áp dụng phương pháp này dễ dàng trên toàn bộ DataFrame bằng cách áp dụng phương pháp.

# 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) 
Các vấn đề liên quan