2010-09-27 34 views
15

Con trăn có cung cấp cách dễ dàng lấy tuần hiện tại của tháng (1: 4) không?python - Số tuần của tháng

+1

Khi bạn đạt đến ngày 29, bạn đang thực sự ở tuần thứ năm, phải không? – erikbwork

+1

Có một tuần bắt đầu vào ngày đầu tiên của tháng hoặc luôn vào Thứ Hai không? Hoặc luôn luôn vào ngày chủ nhật? Hoặc là... ? –

+0

"tuần trong tháng" không chính xác là khái niệm thường được sử dụng. Bạn cần cho chúng tôi biết định nghĩa của bạn là gì, với ví dụ về "tuần của tháng" ... đặc biệt, tuần của tháng WHICH, ví dụ: tuần bắt đầu vào thứ Hai, giả sử hôm nay là cả Chủ nhật và ngày đầu tiên của tháng: bạn có muốn (tháng trước, tuần 5) hoặc (tháng hiện tại, tuần -1 hoặc 0) hay thứ gì khác không? –

Trả lời

22

Để sử dụng bộ phận thẳng, ngày tháng cho các ngày mà bạn đang nhìn vào cần phải được điều chỉnh theo vị trí (trong tuần) của ngày đầu tiên của tháng. Vì vậy, nếu tháng của bạn bắt đầu vào thứ Hai (ngày đầu tiên của tuần), bạn có thể thực hiện phân chia như đề xuất ở trên. Tuy nhiên, nếu tháng bắt đầu vào thứ Tư, bạn sẽ muốn thêm 2 và sau đó thực hiện phép chia. Đây là tất cả được đóng gói trong hàm bên dưới.

from math import ceil 

def week_of_month(dt): 
    """ Returns the week of the month for the specified date. 
    """ 

    first_day = dt.replace(day=1) 

    dom = dt.day 
    adjusted_dom = dom + first_day.weekday() 

    return int(ceil(adjusted_dom/7.0)) 
+4

adjustment_dom = (1 + first_day.weekday())% 7 cho tuần bắt đầu chủ nhật –

+0

Hoạt động thực sự tốt. Cảm ơn bạn. – crazyDiamond

7

Nếu tuần đầu tiên của bạn bắt đầu vào ngày đầu tiên của tháng, bạn có thể sử dụng phân chia số nguyên:

 
import datetime 
day_of_month = datetime.datetime.now().day 
week_number = (day_of_month - 1) // 7 + 1 
+0

có thể datetime.datetime.now(). Ngày sẽ cho ngày hôm nay trong tháng – aeter

+0

@aeter: Thật vậy. Thêm. –

+0

Cảm ơn. Nó chỉ ra nó không phải là về Python sau khi tất cả, nhưng về arithmetics :) –

4

Kiểm tra các python calendar mô-đun

+0

Cảm ơn. Tôi biết về lịch và dateutil, nhưng cả hai đều không giúp tôi. –

+1

vito có câu trả lời đúng. Tôi đã sử dụng: 'st, end = calendar.monthrange (2012, 6)', 'days = range (st, kết thúc + 1)', 'week_days = [ngày [i: i + 7] cho i trong phạm vi (0, len (ngày), 7)] ' – Droogans

1

Tôi tìm thấy một cách khá đơn giản:

import datetime 
def week(year, month, day): 
    first_week_month = datetime.datetime(year, month, 1).isocalendar()[1] 
    if month == 1 and first_week_month > 10: 
     first_week_month = 0 
    user_date = datetime.datetime(year, month, day).isocalendar()[1] 
    if month == 1 and user_date > 10: 
     user_date = 0 
    return user_date - first_week_month 

trả về 0 nếu tuần đầu tiên

+0

' isocalendar() 'có thể trả về 53 cho ngày 1 tháng 1. Thực hiện của bạn trả về -52 cho' weekOfMonth (2010, 1, 8) '. –

+1

Tôi đã sửa mã với một kiểm tra cho lỗi đó, và mã không nhận được lớn và nó thực hiện công việc một cách hoàn hảo. –

+0

Trả lại -47 cho các ngày: 2012-12-31, 2013-12-30, 2013-12-31 –

2

Phiên bản này có thể được cải thiện nhưng như một cái nhìn đầu tiên trong module python (datetime và lịch), tôi làm cho giải pháp này, tôi hy vọng có thể hữu ích:

from datetime import datetime 
n = datetime.now() 
#from django.utils.timezone import now 
#n = now() #if you use django with timezone 

from calendar import Calendar 
cal = Calendar() # week starts Monday 
#cal = Calendar(6) # week stars Sunday 

weeks = cal.monthdayscalendar(n.year, n.month) 
for x in range(len(weeks)): 
    if now.day in weeks[x]: 
     print x+1 
3

Tôi biết đây là tuổi nhưng tôi đã dành rất nhiều thời gian để tìm câu trả lời này. Tôi đã thực hiện phương pháp của riêng mình và nghĩ rằng tôi nên chia sẻ.

Mô đun lịch có phương thức monthcalendar trả về mảng 2D trong đó mỗi hàng đại diện cho một tuần. Ví dụ:

import calendar 
calendar.monthcalendar(2015,9) 

kết quả:

[[0,0,1,2,3,4,5], 
[6,7,8,9,10,11,12], 
[13,14,15,16,17,18,19], 
[20,21,22,23,24,25,26], 
[27,28,29,30,0,0,0]] 

Vì vậy NumPy là nơi là bạn của bạn ở đây. Và tôi đang ở Mỹ vì vậy tôi muốn tuần để bắt đầu vào chủ nhật và tuần đầu tiên được dán nhãn 1:

import calendar 
import numpy as np 
calendar.setfirstweekday(6) 

def get_week_of_month(year, month, day): 
    x = np.array(calendar.monthcalendar(year, month)) 
    week_of_month = np.where(x==day)[0][0] + 1 
    return(week_of_month) 

get_week_of_month(2015,9,14) 

lợi nhuận

3 
0

này nên làm điều đó.

#! /usr/bin/env python2 

import calendar, datetime 

#FUNCTIONS 
def week_of_month(date): 
    """Determines the week (number) of the month""" 

    #Calendar object. 6 = Start on Sunday, 0 = Start on Monday 
    cal_object = calendar.Calendar(6) 
    month_calendar_dates = cal_object.itermonthdates(date.year,date.month) 

    day_of_week = 1 
    week_number = 1 

    for day in month_calendar_dates: 
     #add a week and reset day of week 
     if day_of_week > 7: 
      week_number += 1 
      day_of_week = 1 

     if date == day: 
      break 
     else: 
      day_of_week += 1 

    return week_number 


#MAIN 
example_date = datetime.date(2015,9,21) 

print "Week",str(week_of_month(example_date)) 
#Returns 'Week 4' 
2

Câu trả lời của Josh phải được điều chỉnh một chút để chứa ngày đầu tiên rơi vào chủ nhật.

def get_week_of_month(date): 
    first_day = date.replace(day=1) 

    day_of_month = date.day 

    if(first_day.weekday() == 6): 
     adjusted_dom = (1 + first_day.weekday())/7 
    else: 
     adjusted_dom = day_of_month + first_day.weekday() 

    return int(ceil(adjusted_dom/7.0)) 
0

Câu trả lời của Josh có vẻ tốt nhất nhưng tôi nghĩ rằng chúng ta nên tính đến thực tế là một tuần thuộc về một tháng chỉ khi thứ năm của nó rơi vào tháng đó. Ít nhất đó là what the iso says.

Theo tiêu chuẩn đó, một tháng có thể có tối đa 5 tuần.Một ngày có thể thuộc về một tháng, nhưng tuần mà nó thuộc về có thể không.

tôi đã đưa vào tính toán rằng chỉ bằng cách thêm một đơn giản

if (first_day.weekday()>3) : 
     return ret_val-1 
    else: 
     return ret_val 

nơi ret_val là chính xác giá trị tính toán của Josh. Thử nghiệm vào tháng 6 năm 2017 (có 5 tuần) và vào tháng 9 năm 2017. Việc trả '2017-09-01' trả về 0 vì ngày đó thuộc về một tuần không thuộc vào tháng 9.

Cách chính xác nhất sẽ là để phương thức trả về cả số tuần và tên tháng ngày nhập vào thuộc về.

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