2010-09-27 12 views
15

Python offre un modo per ottenere facilmente la settimana corrente del mese (1: 4)?python - Numero della settimana del mese

+1

Quando raggiungi il 29, sei effettivamente nella quinta settimana, giusto? – erikbwork

+1

La settimana inizia il primo giorno del mese o sempre il lunedì? O sempre di domenica? O... ? –

+0

"settimana del mese" non è esattamente un concetto comunemente usato. Devi dirci qual è la tua definizione, con esempi, di "settimana del mese" ... in particolare, settimana del WHICH, ad es. la settimana inizia lunedì, supponiamo che oggi sia la domenica e il primo giorno del mese: vuoi (mese precedente, settimana 5) o (mese corrente, settimana -1 o 0) o qualcos'altro? –

risposta

22

Per poter utilizzare la divisione dritto, il giorno del mese per la data si sta guardando ha bisogno di essere regolata in base alla posizione (entro la settimana) del primo giorno del mese. Quindi, se il tuo mese inizia a partire da lunedì (il primo giorno della settimana), puoi semplicemente eseguire la divisione come suggerito sopra. Tuttavia, se il mese inizia di mercoledì, dovrai aggiungere 2 e poi fare la divisione. Questo è tutto incapsulato nella funzione seguente.

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

adjusted_dom = (1 + first_day.weekday())% 7 per settimana a partire da domenica –

+0

Funziona davvero bene. Grazie. – crazyDiamond

7

Se la vostra prima settimana inizia il primo giorno del mese è possibile utilizzare divisione intera:

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

forse datetime.datetime.now(). Giorno darebbe il giorno di oggi nel mese – aeter

+0

@aeter: Infatti. Aggiunto. –

+0

Grazie. Alla fine non si trattava di Python, ma di aritmetica :) –

4

Partenza il pitone calendar modulo

+0

Grazie. Sapevo di calendario e datautil, ma entrambi non mi hanno aiutato in questo. –

+1

vito ha la risposta giusta. Ho usato: 'st, end = calendar.monthrange (2012, 6)', 'days = range (st, end + 1)', 'week_days = [giorni [i: i + 7] per i in range (0, len (days), 7)] ' – Droogans

1

ho trovato un modo molto semplice:

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 

restituisce 0 se prima settimana

+0

' isocalendar() 'può restituire 53 per il 1 gennaio. L'implementazione restituisce -52 per' weekOfMonth (2010, 1, 8) '. –

+1

Ho corretto il codice con un controllo per quell'errore, e il codice non è diventato così grande e funziona perfettamente. –

+0

Restituzioni -47 per le date: 2012-12-31, 2013-12-30, 2013-12-31 –

2

Questa versione potrebbe essere migliorata, ma come un primo sguardo a moduli Python (datetime e calendario), io faccio questa soluzione, spero che potrebbe essere utile:

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

So che questo è anni , ma ho passato un sacco di tempo a cercare di trovare questa risposta. Ho fatto il mio metodo e ho pensato di doverlo condividere.

Il modulo del calendario ha un metodo monthcalendar che restituisce un array 2D in cui ogni riga rappresenta una settimana. Per esempio:

import calendar 
calendar.monthcalendar(2015,9) 

risultato:

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

Quindi NumPy Ecco dove è tuo amico qui. E sono in USA così voglio settimana per iniziare la Domenica e la prima settimana da etichettare 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) 

rendimenti

3 
0

Questo dovrebbe farlo.

#! /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

La risposta di Josh deve essere modificata leggermente per soddisfare il primo giorno che cade di domenica.

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

risposta Josh' sembra il migliore, ma penso che dovremmo prendere in considerazione il fatto che una settimana appartiene a un mese solo se il suo Giovedi cade in quel mese. Almeno questo è what the iso says.

Secondo questo standard, un mese può avere fino a 5 settimane.Un giorno potrebbe appartenere a un mese, ma è possibile che la settimana appartenga a.

ho preso in considerazione che solo con l'aggiunta di un semplice

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

dove RET_VAL è esattamente il valore calcolato di Josh. Testato a giugno 2017 (ha 5 settimane) e a settembre 2017. Il passaggio '2017-09-01' restituisce 0 perché quel giorno appartiene a una settimana che non appartiene a settembre.

Il modo più corretto sarebbe quello di restituire il metodo sia il numero della settimana sia il nome del mese a cui appartiene il giorno di immissione.

Problemi correlati