python—当月的周数

python—当月的周数,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是否提供了一种轻松获取当月当前周的方法(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 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

当然,python
datetime
库从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