2010-09-27 31 views
15

¿Ofrece python una forma de obtener fácilmente la semana actual del mes (1: 4)?python - Número de semana del mes

+1

Cuando llegue al día 29, en realidad se encuentra en la quinta semana, ¿verdad? – erikbwork

+1

¿Comienza una semana el primer día del mes o siempre los lunes? O siempre el domingo? O ...? –

+0

"semana del mes" no es exactamente un concepto comúnmente utilizado. Debe indicarnos cuál es su definición, con ejemplos, de "semana del mes" ... en particular, semana de CUAL el mes, p. La semana comienza el lunes, supongamos que hoy es domingo y el primer día del mes: ¿desea (mes anterior, semana 5) o (mes actual, semana -1 o 0) o alguna otra cosa? –

Respuesta

22

Para utilizar división consecutivo, el día del mes de la fecha que está viendo las necesidades que se ajusta de acuerdo con la posición (dentro de la semana) del primer día del mes. Entonces, si su mes comienza el lunes (el primer día de la semana), puede hacer la división como se sugiere arriba. Sin embargo, si el mes comienza el miércoles, querrá agregar 2 y luego hacer la división. Todo esto está encapsulado en la función a continuación.

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 para la semana que comienza el domingo –

+0

Funciona muy bien. Gracias. – crazyDiamond

7

Si su primera semana comienza el primer día del mes se puede utilizar la división entera:

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

tal vez datetime.datetime.now(). Day daría el día de hoy en el mes – aeter

+0

@aeter: De hecho. Adicional. –

+0

Gracias. Resulta que no se trataba de Python después de todo, sino de aritmética :) –

4

Salida del pitón calendar módulo

+0

Gracias. Sabía sobre calendar y dateutil, pero ambos no me ayudaron en eso. –

+1

vito tiene la respuesta correcta. Utilicé: 'st, end = calendar.monthrange (2012, 6)', 'days = range (st, end + 1)', 'week_days = [days [i: i + 7] para i en rango (0, len (días), 7)] ' – Droogans

1

he encontrado una manera bastante simple:

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 

devuelve 0 si la primera semana

+0

' isocalendar() 'puede devolver 53 para el 1 de enero. Su implementación devuelve -52 para' weekOfMonth (2010, 1, 8) '. –

+1

Arreglé el código con una verificación de ese error, y el código no es tan grande y hace el trabajo a la perfección. –

+0

Devoluciones -47 para Fechas: 2012-12-31, 2013-12-30, 2013-12-31 –

2

Esta versión podría ser mejorado, sino como un primer vistazo en los módulos de Python (fecha y hora y el calendario), que hacen de esta solución, espero que podría ser útil:

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

Sé que esto es años de edad , pero pasé mucho tiempo tratando de encontrar esta respuesta. Hice mi propio método y pensé que debería compartirlo.

El módulo de calendario tiene un método monthcalendar que devuelve una matriz 2D donde cada fila representa una semana. Por ejemplo:

import calendar 
calendar.monthcalendar(2015,9) 

resultado:

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

Así numpy es donde está tu amigo aquí. Y estoy en EE.UU., así que quiero la semana para iniciar el domingo y la primera semana a etiquetar 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) 

vuelve

3 
0

Esto debe hacerlo.

#! /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 respuesta de Josh debe ajustarse ligeramente para acomodar el primer día de un domingo.

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

respuesta Josh' parece la mejor, pero creo que debemos tener en cuenta el hecho de que una semana es de un mes sólo si su Jueves cae en ese mes. Al menos eso es what the iso says.

Según ese estándar, un mes puede tener hasta 5 semanas.Un día podría pertenecer a un mes, pero la semana a la que pertenece no puede.

he tenido en cuenta que sólo mediante la adición de un simple

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

donde ret_val es exactamente valor calculado de Josh. Probado en junio de 2017 (tiene 5 semanas) y en septiembre de 2017. Pasar '2017-09-01' devuelve 0 porque ese día pertenece a una semana que no pertenece a septiembre.

La forma más correcta sería que el método devuelva tanto el número de la semana como el nombre del mes al que pertenece el día de la entrada.

Cuestiones relacionadas