Pregunta python - Número de semana del mes


¿Python ofrece una manera de obtener fácilmente la semana actual? Del mes (1: 4)?


15
2017-09-27 17:57


origen


Respuestas:


Para usar la división directa, el día del mes para la fecha que está mirando debe ajustarse según 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))

23
2018-05-29 02:30



Si su primera semana comienza el primer día del mes, puede usar la división de enteros:

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

7
2017-09-27 18:02



Sé que esto tiene años, 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í que numpy es donde está tu amigo aquí. Y estoy en EE. UU., Así que quiero que la semana comience el domingo y la primera semana que se etiquete 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)

devoluciones

3

5
2017-09-15 19:27



Mira la pitón calendario módulo


4
2017-09-27 18:03



Esta versión podría mejorarse pero, como primer vistazo a los módulos de Python (fecha y calendario), creo esta solución, espero que pueda 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
2017-10-30 19:50



La respuesta de Josh tiene que ser modificada 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))

2
2017-12-15 19:40



Encontré 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


1
2017-12-06 22:54



por favor enlace a Python: número de la semana en un mes

Todo depende de cuándo sea el primer lunes del mes


0
2017-08-12 14:49



Esto debería 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'

0
2017-09-22 04:05



La respuesta de Josh parece ser la mejor, pero creo que deberíamos tener en cuenta el hecho de que una semana pertenece a un mes solo si el jueves cae en ese mes. Al menos eso es lo que dice la iso.

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 podría no.

He tenido en cuenta que solo agregando un simple

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

donde ret_val es exactamente el 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 hacer que el método devuelva el número de la semana y el nombre del mes el día de entrada pertenece a.


0
2017-09-22 12:46