2014-12-28 19 views
6

Tôi muốn biết cách bạn nhận được các tháng theo ngày, số tuần và năm.Nhận từng tháng, ngày và năm

Ví dụ nếu bạn có một cái gì đó như thế này

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

Kiểm tra mô-đun [Lịch] (http://docs.python.org/library/calendar.html#module-calendar) một lần :) –

+0

Vì sao làm việc từ ngày/tuần/năm? Chỉ cần làm việc ra ngày và sau đó sử dụng strftime() với% U hoặc% W. Xem: https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior – rtome

+1

Hãy thử một ngày trong 12 tháng và xem ngày nào phù hợp với số tuần chính xác. – interjay

Trả lời

2

mỗi interjay's suggestion:

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

lưu ý: ["tuần iso" có ý nghĩa đặc biệt] (https://docs.python.org/3/library/datetime.html#datetime.date.isocalendar). 'datetime (2015, 1,1) .isocalendar()' trả về giá trị dự kiến ​​'(2015, 1, 4)' nhưng 'datetime (2016, 1,1) .isocalendar()' trả về '(2015, 53, 5) 'tức là, ngày 1 tháng 1 năm 2016 được coi là tuần * iso * thứ 53 của * * năm trước * 2015. – 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

Từ tài liệu: "Khi được sử dụng với phương thức strptime(),% U và% W chỉ được sử dụng trong các phép tính khi ngày trong tuần và năm được chỉ định". Có vẻ như OP đang sử dụng số ngày trong tháng và không phải trong tuần. – interjay

+0

Có, bạn có quyền. – torm

+0

Số ngày trong ví dụ của OP có các giá trị như 28 và 13, vì vậy, không thể là số ngày trong tuần. – interjay

2

Bạn có thể làm điều đó với các mô-đun isoweek, một cái gì đó như thế này ví dụ đầu tiên của bạn:

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

cảm ơn rất nhiều vì câu trả lời! Ngắn và hoàn hảo! :) – Sigils

2

Tôi đang sử dụng python-dateutil khi tôi cần triển khai một số hoạt động ngày phức tạp.

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

cảm ơn rất nhiều câu trả lời! Tôi yêu tất cả các bạn đều cho tôi câu trả lời giống nhau nhưng theo một cách khác! – Sigils

Các vấn đề liên quan