python - номер недели месяца - PullRequest
16 голосов
/ 27 сентября 2010

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

Ответы [ 12 ]

27 голосов
/ 29 мая 2013

Чтобы использовать прямое деление, день месяца для даты, на которую вы смотрите, должен быть скорректирован в соответствии с позицией (в течение недели) первого дня месяца.Итак, если ваш месяц начинается в понедельник (первый день недели), вы можете просто выполнить деление, как указано выше.Однако, если месяц начинается в среду, вам нужно добавить 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))
9 голосов
/ 27 сентября 2010

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

import datetime
day_of_month = datetime.datetime.now().day
week_number = (day_of_month - 1) // 7 + 1
6 голосов
/ 15 сентября 2015

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

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

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
4 голосов
/ 27 сентября 2010

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

3 голосов
/ 30 октября 2014

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

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
2 голосов
/ 16 ноября 2018

Проверьте пакет маятник

>>> dt = pendulum.parse('2018-09-30')
>>> dt.week_of_month
5
2 голосов
/ 15 декабря 2015

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

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))
1 голос
/ 07 декабря 2010

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

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, если первая неделя

0 голосов
/ 27 марта 2019

Перейти к последнему дню недели в месяце и разделить на 7 из математического импорта ceil

def week_of_month(dt):
    """ Returns the week of the month for the specified date.
    """
    # weekday from monday == 0 ---> sunday == 6
    last_day_of_week_of_month = dt.day + (7 - (1 + dt.weekday()))
    return int(ceil(last_day_of_week_of_month/7.0))
0 голосов
/ 22 сентября 2017

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

Согласно этому стандарту, месяц может иметь до 5 недель. День может принадлежать месяцу, но неделя, к которой он принадлежит , может не принадлежать.

Я учел это, просто добавив простое

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

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

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

...