2011-07-02 29 views

cevap

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

'((gün - bugün) + 7)% 7 'almak için gün fark – jstaab

+2

Ben sadece '(gün - bugün)% 7' – bsa

18

sonraki Pazartesi 7 günü Pazartesi sonra 6 günü salı sonra, vb, ve ayrıca kullanarak olduğuna kullanılarak

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

deneyin o Python'un datetime türü raporları Pazartesi olarak 0, ..., Pazar olarak 6.

+0

hile yapmak gerektiğini düşünüyorum - Bu datetime (2013, 1, 1) "datetime (2013, 1) ile yaklaşan Pazar bulmaya çalıştığınızda , 1) + timedelta (gün = (7 - datetime (2013, 1, 1) .weekday())) "," datetime.datetime (2013, 1, 7, 0, 0) "olsun, bir pazartesi . – fixxxer

+0

@fixxxer - Yanıtda da belirttiği gibi: kod, "datetime" API'sinin birkaç özelliğini, yalnızca pazartesi günleri arıyorsanız, yalnızca çalışacak şekilde kullanır. "Phihag" tarafından sağlanan kod daha geneldir ve yaklaşan herhangi bir günü bulabilir. – Dirk

+0

Timedelta'da 7 yerine 6'nın kullanılmasına yardımcı olacağını düşünüyor musunuz? – fixxxer

3

Tarihe bir gün eklemeye başlayabilir ve pazartesi günlerinde durabilirsiniz.

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

bu ilk sonraki Pazartesi günü, sonra verilen tarih verecektir:

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

listesi ile anlama?

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

Burada biraz üzerinde ağır cevaplara bir öz ve jenerik bir alternatiftir.

# 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

Bu cevap upvotes toplamak için çok geç geldi, ama benim favorim. – ASalazar

+1

Son derece temiz, oy hakkım var. – Liquidgenius

1

Bir diğer basit ve zarif çözüm pandas ofsetlerini kullanmaktır.
Tarihleri ​​ile oynarken çok yararlı ve sağlam buluyorum.
- İlk Pazar gününü istiyorsanız, frekansı frek = 'W-SUN' olarak değiştirin.
- Birkaç sonraki Pazar gününü isterseniz, ofsetleri değiştirin. Gün (gün).
- Pandalar ofsetlerini kullanmak, tatil günlerini görmezden gelmenizi, yalnızca İş Günleri ve daha fazlası ile çalışmanızı sağlar.
Ayrıca, bu yöntemi uygulama yöntemini kullanarak tüm DataFrame'e kolayca uygulayabilirsiniz.

# 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) 
İlgili konular