python是否提供了一种轻松获取当月 (1:4)的方法?
答案 0 :(得分:27)
为了使用直接分割,需要根据当月第一天的位置(在一周内)调整您所查看日期的月份日期。因此,如果您的月份恰好在星期一(一周的第一天)开始,您可以按照上面的建议进行划分。但是,如果月份从星期三开始,您将要添加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))
答案 1 :(得分:9)
如果您的第一周从该月的第一天开始,您可以使用整数除法:
import datetime day_of_month = datetime.datetime.now().day week_number = (day_of_month - 1) // 7 + 1
答案 2 :(得分:6)
我知道这已经有好几年了,但我花了很多时间试图找到这个答案。我制定了自己的方法,并认为我应该分享。
日历模块有一个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]]
如此笨拙,你的朋友在这里。而且我在美国所以我希望这个星期在星期日和第一周开始标记为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
答案 3 :(得分:4)
查看python calendar模块
答案 4 :(得分:3)
这个版本可以改进,但作为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
答案 5 :(得分:2)
Josh的答案必须稍微调整,以适应第一天的星期日。
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))
答案 6 :(得分:2)
检出包裹Pendulum
>>> dt = pendulum.parse('2018-09-30')
>>> dt.week_of_month
5
答案 7 :(得分:1)
我找到了一个非常简单的方法:
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
答案 8 :(得分:1)
说我们有一个月的日历,如下:
Mon Tue Wed Thur Fri Sat Sun
1 2 3
4 5 6 7 8 9 10
我们说第1〜3天属于第1周,第4〜10天属于第2周,等等。
在这种情况下,我认为特定日期的week_of_month应该计算如下:
import datetime
def week_of_month(year, month, day):
weekday_of_day_one = datetime.date(year, month, 1).weekday()
weekday_of_day = datetime.date(year, month, day)
return (day - 1)//7 + 1 + (weekday_of_day < weekday_of_day_one)
但是,如果相反,我们想获取日期所在的工作日的第n天,例如第1天是 1st 星期五,第8天是 2 星期五,而第6天是 1st 星期三,那么我们只需返回(day-1)// 7 + 1
答案 9 :(得分:0)
这应该这样做。
#! /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'
答案 10 :(得分:0)
请链接到Python: Number of the Week in a Month
IT全部取决于当月的第一个星期一
答案 11 :(得分:0)
乔希的回答似乎是最好的,但我认为我们应该考虑到这样一个事实,即一个星期只有在它的星期四落入那个月才属于一个月。至少那是what the iso says。
根据该标准,一个月最长可达5周。一天可能属于一个月,但它所属的那一周可能不属于。
我考虑到只是添加一个简单的
if (first_day.weekday()>3) :
return ret_val-1
else:
return ret_val
其中ret_val恰好是Josh的计算值。经过2017年6月(有5周)和2017年9月的测试。通过'2017-09-01'会返回0,因为该日属于不属于9月的一周。
最正确的方法是让方法返回输入日所属的周数和月份名称。
答案 12 :(得分:0)
移动到每月的一周的最后一天并除以7 从数学导入单元格
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))
答案 13 :(得分:0)
def week_of_month(date_value):
return (date_value.isocalendar()[1] - date_value.replace(day=1).isocalendar()[1] + 1)
date_value应该采用时间戳格式 这将在所有情况下都给出完美的答案
答案 14 :(得分:0)
@Manuel Solorzano's answer的变体形式:
from calendar import monthcalendar
def get_week_of_month(year, month, day):
return next(
(
week_number
for week_number, days_of_week in enumerate(monthcalendar(year, month), start=1)
if day in days_of_week
),
None,
)
例如:
>>> get_week_of_month(2020, 9, 1)
1
>>> get_week_of_month(2020, 9, 30)
5
>>> get_week_of_month(2020, 5, 35)
None
答案 15 :(得分:0)
import datetime
def week_number_of_month(date_value):
week_number = (date_value.isocalendar()[1] - date_value.replace(day=1).isocalendar()[1] + 1)
if week_number == -46:
week_number = 6
return week_number
date_given = datetime.datetime(year=2018, month=12, day=31).date()
week_number_of_month(date_given)
答案 16 :(得分:0)
您要查找的答案是 (dm-dw+(dw-dm)%7)/7+1
,其中 dm
是一个月中的第几天,dw
是一周中的第几天,而 %
是正余数.
这来自于将月份偏移量 (mo
) 和月份中的一周 (wm
) 相关联,其中月份偏移量是第一天开始到一周的距离。如果我们考虑所有这些变量都从 0 开始,我们有
wm*7+dw = dm+mo
您可以为 mo
求解此模 7,因为这会导致 wm
变量丢失,因为它仅显示为 7 的倍数
dw = dm+mo (%7)
mo = dw-dm (%7)
mo = (dw-dm)%7 (since the month offset is 0-6)
然后您只需将月份偏移量代入原始方程并求解 wm
wm*7+dw = dm+mo
wm*7 = dm-dw + mo
wm*7 = dm-dw + (dw-dm)%7
wm = (dm-dw + (dw-dm)%7) / 7
由于 dm
和 dw
总是成对出现的,它们可以任意偏移,因此,将所有内容切换为 1 只会将等式更改为 (dm-dw + (dw-dm)%7)/7 + 1
。
当然,python datetime
库从 dm
开始,dw
从 0 开始。所以,假设 date
是一个 datatime.date
对象,你可以去与
(date.day-1-date.dayofweek() + (date.dayofweek()-date.day+1)%7) / 7 + 1
由于内部位始终是 7 的倍数(字面意思是 dw*7
),您可以看到第一个 -date.dayofweek()
只是将值向后调整为最接近 7 的倍数。整数除法就是这样做的同样,因此可以进一步简化为
(date.day-1 + (date.dayofweek()-date.day+1)%7) // 7 + 1
请注意,dayofweek()
将星期日置于周末。