python—当月的周数
python是否提供了一种轻松获取当月当前周的方法(1:4)?如果您的第一周从当月的第一天开始,您可以使用整数除法: import datetime day_of_month = datetime.datetime.now().day week_number = (day_of_month - 1) // 7 + 1 导入日期时间 每月的第天=datetime.datetime.now().day 周数=(月中日-1)//7+1python—当月的周数,python,time,week-number,Python,Time,Week Number,python是否提供了一种轻松获取当月当前周的方法(1:4)?如果您的第一周从当月的第一天开始,您可以使用整数除法: import datetime day_of_month = datetime.datetime.now().day week_number = (day_of_month - 1) // 7 + 1 导入日期时间 每月的第天=datetime.datetime.now().day 周数=(月中日-1)//7+1 查看python模块我发现了一个非常简单的方法: import d
查看python模块我发现了一个非常简单的方法:
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。您查看的日期的月日需要根据该月第一天的位置(周内)进行调整。因此,如果您的月份恰好在周一(一周的第一天)开始,您可以按照上面的建议进行除法。但是,如果该月开始于星期三,则需要添加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))
这个版本可以改进,但作为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 n.day in weeks[x]:
print x+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]]
努比,你的朋友在哪里。我在美国,所以我希望本周从周日开始,第一周的标签为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
这应该可以做到
#! /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'
乔希的答案必须稍加调整,以适应星期天的第一天
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))
乔希的答案似乎是最好的,但我认为我们应该考虑到这样一个事实:一周只属于一个月,如果它的星期四属于那个月。至少是这样 根据这个标准,一个月最多可以有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,因为该天属于不属于九月的一周
最正确的方法是让该方法返回输入日所属的周数和月名。查看该包
移动到月内一周的最后一天并除以7
from math import 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))
日期值应为时间戳格式
这将在所有情况下给出完美的答案关于:
例如:
假设我们有如下几个月的日历:
Mon Tue Wed Thur Fri Sat Sun
1 2 3
4 5 6 7 8 9 10
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)
我们说第1~3天属于第1周,第4~10天属于第2周等等
在这种情况下,我认为某一天的周/月应按如下方式计算:
Mon Tue Wed Thur Fri Sat Sun
1 2 3
4 5 6 7 8 9 10
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)
导入日期时间
def周/月(年、月、日):
weekday_of_day_one=datetime.date(年、月、1).weekday()
工作日=datetime.date(年、月、日)
返回(第1天)//7+1+(第1天的工作日<第1天的工作日)
但是,如果我们想得到该日期所在的工作日的第n天,例如第1天是第一个星期五,第8天是第二个星期五,第6天是第一个星期三,那么我们可以简单地返回(第1天)//7+1/7+1其中,
dm
是一个月中的一天,dw
是一周中的一天,%
是正余数
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)
这是通过关联月份偏移量(mo
)和月份的一周(wm
)得出的,其中月份偏移量是指第一天开始的一周的距离。如果我们考虑所有这些变量在0开始,我们有< /P>
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
当然,pythondatetime
库从1开始dm
,从0开始dw
。因此,假设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()
将星期日放在一周的末尾。当你到达29日时,你实际上已经是第五周了,对吗?一周是从一个月的第一天开始还是总是在星期一开始?还是总是在星期天?或“每月的一周”并不是一个常用的概念。你需要告诉我们你对“每月一周”的定义,并举例说明。。。特别是哪一个月的哪一周,例如周从星期一开始,假设今天既是星期天又是一个月的第一天:你想要(上个月,第5周)还是(当前月份,第1周或第0周)或其他什么?这里有一个定义:Mark Byers的回答直截了当。我正在使用cx_Oracle访问一个Oracle数据库,并试图优化已通过月和周查询的计算时间(表按月分区,按周分区,John Machin link将其定义为:“月的周字段范围从..1到..5”),可能是datetime.datetime.now().day会把今天定在Monhthanks。事实证明,这毕竟不是关于Python,而是关于算术:)我不清楚这是否有效。假设您的一周从周一开始,感兴趣的月份的第一天是周日,您希望将月份1的第1天映射到月份1的第1周。T
(date.day-1-date.dayofweek() + (date.dayofweek()-date.day+1)%7) / 7 + 1
(date.day-1 + (date.dayofweek()-date.day+1)%7) // 7 + 1