2010-09-27 75 views
15

蟒蛇提供了一种方式来轻松获取当月(1:4)的本周吗?蟒蛇 - 本月的周数

+1

当你到达29日,你实际上是在第五周,对吧? – erikbwork 2010-09-27 17:59:24

+1

一个星期是在一个月的第一天开始还是一直在星期一开始?或者总是在星期天?要么... ? – 2010-09-27 18:02:02

+0

“本月的星期”并不完全是一个常用的概念。您需要告诉我们您的定义是什么,例如“本月的周”......特别是每个月的哪一周,例如一周从星期一开始,假设今天是星期天和月的第一天:你想要(上个月,第5周)还是(当前月,第-1周或第0周)或其他什么? – 2010-09-28 00:47:44

回答

22

为了使用直师,月供您正在寻找需要的日期当天根据位置进行调整(一周内)。所以,如果你的月份恰好在星期一(一周的第一天)开始,你可以按照上面的建议进行分工。但是,如果该月在星期三开始,则您需要添加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)) 
+4

adjusted_dom =(1 + first_day.weekday())%7周开始周日 – 2014-03-03 18:13:37

+0

工作得很好。谢谢。 – crazyDiamond 2015-12-15 16:26:10

7

如果你的第一个星期开始的一个月,你可以使用整数除法的第一天:

 
import datetime 
day_of_month = datetime.datetime.now().day 
week_number = (day_of_month - 1) // 7 + 1 
+0

也许datetime.datetime.now()。天将给予当月的今天一天 – aeter 2010-09-27 18:11:19

+0

@aeter:确实。添加。 – 2010-09-27 18:14:05

+0

谢谢。 事实证明,这毕竟不是关于Python,而是关于算术:) – 2010-09-28 11:00:41

4

退房蟒蛇calendar模块

+0

谢谢。 我知道日历和dateutil,但都没有帮助我。 – 2010-09-28 10:59:50

+1

维托有正确的答案。我使用:'st,end = calendar.monthrange(2012,6)','days = range(st,end + 1)','week_days = [days [i:i + 7] len(days),7)]' – Droogans 2012-06-06 15:01:07

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

+0

'isocalendar()'可以在1月1日返回53.您的实现对'weekOfMonth(2010,1,8)'返回-52。 – 2010-12-06 23:08:19

+1

我修复了代码并检查了那个错误,代码没有那么大,它完美地完成了这项工作。 – 2010-12-07 00:57:10

+0

返回-47日期:2012-12-31,2013-12-30,2013-12-31 – 2013-01-26 16:16:56

2

这个版本还有待改进,但在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 
3

我知道这是岁,但我花了很多时间试图找到答案。我做了我自己的方法,并认为我应该分享。

日历模块有一个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 
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' 
2

乔希的答案必须微调,以适应星期天的第一天。

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)) 
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月份的一周。

最正确的方法是使该方法返回输入日所属的周数和月份名称