python-номер недели месяца

предлагает ли python способ легко получить текущую неделю месяца (1:4) ?

10 ответов


чтобы использовать прямое деление, день месяца для даты, на которую вы смотрите, должен быть скорректирован в соответствии с позицией (в течение недели) первого дня месяца. Итак, если ваш месяц начинается в понедельник (первый день недели), вы можете просто сделать разделение, как было предложено выше. Однако, если месяц начинается в среду, вы захотите добавить 2, а затем сделать разделение. Все это инкапсулировано в функцию ниже.

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))

Если ваша первая неделя начинается в первый день месяца, вы можете использовать целочисленное деление:

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

Я знаю, что это много лет, но я потратил много времени, пытаясь найти этот ответ. Я придумал свой собственный метод и решил поделиться.

модуль календаря имеет метод monthcalendar, который возвращает 2D-массив, где каждая строка представляет неделю. Например:

import calendar
calendar.monthcalendar(2015,9)

результат:

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

так numpy, где ваш друг здесь. И я в США, поэтому я хочу, чтобы неделя началась в воскресенье и первая неделя была помечена 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)

возвращает

3

Проверьте python календарь модуль


эта версия может быть улучшена, но как первый взгляд в модулях python (datetime и calendar), я делаю это решение, я надеюсь, может быть полезно:

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

ответ Джоша должен быть слегка изменен, чтобы приспособить первый день, падающий в воскресенье.

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))

Я нашел довольно простой способ:

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

возвращает 0, если первая неделя


по ссылке Python: количество недель в месяц

все зависит от того, когда 1-й понедельник месяца -


это должно помочь.

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

ответ Джоша кажется лучшим, но я думаю, что мы должны учитывать тот факт, что неделя принадлежит месяцу, только если ее четверг попадает в этот месяц. По крайней мере, это что говорит iso.

согласно этому стандарту, месяц может иметь до 5 недель. День может принадлежать месяцу, но ... --6-->неделя принадлежит не может.

Я принял во внимание, что просто добавив простой

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

где ret_val является точно рассчитанное значение Джоша. Протестировано в июне 2017 года (имеет 5 недель) и в сентябре 2017 года. Передача "2017-09-01" возвращает 0, потому что этот день принадлежит неделе, которая не принадлежит к сентябрю.

наиболее правильным способом было бы, чтобы метод вернул как номер недели и название месяца входной день принадлежит.