2014-12-28 13 views
6

Aylar gününü, hafta sayısını ve yılını nasıl alacağınızı bilmek istiyorum. ÖrneğinHaftaya, aya ve aya, aya ve aya ulaşın Ay

bu

def getmonth(day, week, year): 
    # by day, week and year calculate the month 
    print (month) 

getmonth(28, 52, 2014) 
# print 12 

getmonth(13, 42, 2014) 
# print 10 

getmonth(6, 2, 2015) 
# print 1 
+0

Kontrol ettiğinde [Takvim] (http://docs.python.org/library/calendar.html#module-calendar) modülü :) –

+0

Neden bir gün/hafta/yıl çalışacak mı? Sadece tarihi öğrenin ve sonra% U veya% W ile strftime() kullanın. Bkz. Https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior – rtome

+1

Günün 12 ayda bir deneyin ve hangisinin doğru hafta sayısına karşılık geldiğini görün. – interjay

cevap

2

interjay's suggestion başına:

import datetime as DT 

def getmonth(day, week, year): 
    for month in range(1, 13): 
     try: 
      date = DT.datetime(year, month, day) 
     except ValueError: 
      continue 
     iso_year, iso_weeknum, iso_weekday = date.isocalendar() 
     if iso_weeknum == week: 
      return date.month 

print(getmonth(28, 52, 2014)) 
# 12 

print(getmonth(13, 42, 2014)) 
# 10 

print(getmonth(6, 2, 2015)) 
# 1 
+0

not: ["iso hafta" özel bir anlamı vardır) (https://docs.python.org/3/library/datetime.html#datetime.date.isocalendar). 'datetime (2015, 1,1) .isocalendar() 'beklenen değeri döndürür (2015, 1, 4)' datetime (2016, 1,1) .isocalendar() 'döndürür (2015, 53, 5) Yani, 1 Ocak 2016, * önceki * 2015 yılının * 53 * * iso haftası olarak kabul edilir. – jfs

2
from datetime import datetime, timedelta  
def getmonth(day, week, year): 
    d = datetime.strptime('%s %s 1' % (week-1, year), '%W %Y %w') 

    for i in range(0, 7): 
     d2 = d + timedelta(days=i) 
     if d2.day == day: 
      return d2.month 
+1

Belgelerden: "strptime() yöntemiyle kullanıldığında,% U ve% W yalnızca, haftanın günü ve yıl belirtildiğinde hesaplamalarda kullanılır." OP'nin aydaki gün numarasını değil, haftanın gününü kullanıyor gibi görünüyor. – interjay

+0

Evet, haklısınız. – torm

+0

OP'nin örneklerinde gün sayısı 28 ve 13 gibi değerlere sahiptir, bu nedenle haftadaki gün numarası olamaz. – interjay

2

gibi bir şey Sen isoweek modülü ile bunu yapabilir varsa, ilk örneğin böyle bir şey:

from isoweek import Week 
w = Week(2014, 52) 
candidates = [date for date in w.days() if date.day == 28] 
assert len(candidates) == 1 
date = candidates[0] # your answer 
+0

Cevabınız için çok teşekkürler! Kısa ve mükemmel! :) – Sigils

2

Bazı zor tarih işlemleri gerçekleştirmem gerektiğinde python-dateutil kullanıyorum.

from datetime import date 
from dateutil.rrule import YEARLY, rrule 

def get_month(day, week, year): 
    rule = rrule(YEARLY, byweekno=week, bymonthday=day, dtstart=date(year, 1, 1)) 
    return rule[0].month 
+0

Cevabınız için çok teşekkürler! Hepinizin bana aynı cevabı verdiğinizi ama farklı bir şekilde sevdiğini seviyorum! – Sigils

İlgili konular