Python:一个月的第三个星期五

时间:2013-08-25 00:22:57

标签: python date datetime calendar datetimeoffset

我是一名新手python程序员,我需要编写一个脚本来检查一个给定的日期(在表格'月,日年'中作为字符串传递)是否是该月的第三个星期五。我使用的是Python 2.7。

例如,这些日期可以帮助您更好地理解我的问题。手头有年历。

  • 输入--->输出
  • ' 2013年1月18日' --->真
  • ' 2013年2月22日' --->错误
  • ' 2013年6月21日' --->真的
  • ' 2013年9月20日' --->真

我只想使用该语言提供的标准类,如时间,日期时间,日历等。

我已经研究了一些答案,但我看到每天的addidng /减少86400秒的计算,甚至根据一个月的天数进行比较。恕我直言这些是错误的,因为Python中的libreries已经处理了这些细节,所以没有必要重新发明轮子。日历和日期也很复杂:闰年,闰秒,时区,周数等等。所以我认为最好让图书馆解决这些棘手的细节。

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:18)

这应该这样做:

from datetime import datetime 

def is_third_friday(s):
    d = datetime.strptime(s, '%b %d, %Y')
    return d.weekday() == 4 and 15 <= d.day <= 21

测试:

print is_third_friday('Jan 18, 2013')  # True
print is_third_friday('Feb 22, 2013')  # False
print is_third_friday('Jun 21, 2013')  # True
print is_third_friday('Sep 20, 2013')  # True

答案 1 :(得分:2)

你可以使用这样的东西来获得当月的第三个星期五(当月),然后简单地将第三个星期五与你的一天(按年,月,日)进行比较

from datetime import datetime, timedelta
import calendar

now = datetime.now()
first_day_of_month = datetime(now.year, now.month, 1)
first_friday = first_day_of_month + timedelta(days=((4-calendar.monthrange(now.year,now.month)[0])+7)%7)
# 4 is friday of week
third_friday = first_friday + timedelta(days=14)

希望这有帮助。

答案 2 :(得分:2)

另一种实现此目的的方法......使用整数除法......

import datetime

def is_date_the_nth_friday_of_month(nth, date=None):
    #nth is an integer representing the nth weekday of the month
    #date is a datetime.datetime object, which you can create by doing datetime.datetime(2016,1,11) for January 11th, 2016

    if not date:
        #if date is None, then use today as the date
        date = datetime.datetime.today()

    if date.weekday() == 4:
        #if the weekday of date is Friday, then see if it is the nth Friday
        if (date.day - 1) // 7 == (nth - 1):
            #We use integer division to determine the nth Friday
            #if this integer division == 0, then date is the first Friday, 
            # if the integer division is...
            #   1 == 2nd Friday
            #   2 == 3rd Friday
            #   3 == 4th Friday
            #   4 == 5th Friday
            return True

    return False

答案 3 :(得分:1)

如果您要查找option的到期日,可以使用类似的内容

from datetime import datetime
import calendar

def option_expiration(date):
    day = 21 - (calendar.weekday(date.year, date.month, 1) + 2) % 7
    return datetime(date.year, date.month, day)

print option_expiration(datetime.today())

答案 4 :(得分:0)

这是到目前为止我发现的最好的。

from datetime import date
from dateutil.relativedelta import relativedelta, FR

def get_third_fri_of_mth(dt):
    print (dt + relativedelta(day=1, weekday=FR(3)))

get_third_fri_of_mth(date(2019, 1, 30))
get_third_fri_of_mth(date(2019, 6, 4))

相对增量将您指定的日期中的日期替换为day = 1。 从这个新日期开始,weekday = FR(3)指定了第三个星期五。