【问题标题】:Python: third Friday of a monthPython:一个月的第三个星期五
【发布时间】:2013-08-25 00:22:56
【问题描述】:

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

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

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

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

我已经查看了一些答案,但我看到了诸如每天加/减 86400 秒之类的计算,甚至根据一个月的天数进行比较。恕我直言,这些都是错误的,因为 Python 中的库已经处理了这些细节,因此无需重新发明轮子。日历和日期也很复杂:闰年、闰秒、时区、周数等,所以我认为最好让图书馆解决这些棘手的细节。

提前感谢您的帮助。

【问题讨论】:

  • 输入日总是星期五吗?
  • 输入是随机的,他想检查输入日期是否是每月的第三个星期五
  • 您的输入总是采用“Mmm dd, YYYY”的形式吗?如果是这样,您如何拆分该字符串以将月、日和年放在单独的变量中?您如何将它们传递给库以获取包含星期几等信息的对象?
  • 日期始终是星期五。并且输入始终采用相同的形式“月日,年”。

标签: python date datetime calendar datetimeoffset


【解决方案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())

【讨论】:

    【解决方案2】:

    应该这样做:

    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
    

    【讨论】:

    • 非常感谢您的帮助。非常聪明和简短的回答。我没有意识到,我的解决方案更复杂!
    • 您能否详细说明您是如何为14 &lt; d.day &lt; 22 选择日期的?我很好奇在不同的一周的不同工作日会是什么。
    • @MichaelMolter 前 7 天必须有一个星期五。所以第一个星期五是从 1 到 7,这意味着(加 14)第三个星期五是从 15 到 21。
    • 一周中的所有第 3 天都在 15-21 范围内,与一周中的所有第 2 天都在 8-14 范围内以及一周中的所有第 1 天都在 1-7 范围内相同。我要改写的是15 &lt;= d.day &lt;= 21,我觉得更直观。
    【解决方案3】:

    您可以使用类似的方法获取该月的第三个星期五(当前月份),然后简单地将第三个星期五与您的日期(按年、月、日)进行比较

    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)
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      这是迄今为止我发现的最好的。

      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) 指定第三个星期五。

      【讨论】:

        【解决方案5】:

        实现这一点的另一种方法...使用整数除法...

        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
        

        【讨论】:

          猜你喜欢
          • 2023-03-21
          • 2021-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多