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 (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, потому что этот день принадлежит неделе, которая не принадлежит к сентябрю.
наиболее правильным способом было бы, чтобы метод вернул как номер недели и название месяца входной день принадлежит.