【问题标题】:Get the last thursday of the current month using python使用python获取当月的最后一个星期四
【发布时间】:2016-05-02 06:04:20
【问题描述】:

answer 之后,我试图获取本月最后一个星期四的日期。但是我的代码没有跳出循环。

from datetime import datetime
from dateutil.relativedelta import relativedelta, TH

todayte = datetime.today()
cmon = todayte.month

nthu = todayte
while nthu.month == cmon:
    nthu += relativedelta(weekday=TH(1))
    #print nthu.strftime('%d%b%Y').upper()

【问题讨论】:

    标签: python datetime python-dateutil


    【解决方案1】:

    你可以这样做:

    import pandas as pd
    from dateutil.relativedelta import relativedelta, TH
    
    expiry_type = 0
    today = pd.datetime.today()
    expiry_dates = []
    
    if expiry_type == 0:
        # Weekly expiry
        for i in range(1,13):
             expiry_dates.append((today + relativedelta(weekday=TH(i))).date())
    else:
        # Monthly expiry
        for i in range(1,13):
            x = (today + relativedelta(weekday=TH(i))).date()
            y = (today + relativedelta(weekday=TH(i+1))).date()
            if x.month != y.month :
                if x.day > y.day :
                    expiry_dates.append(x)
    
    print(expiry_dates)
    

    【讨论】:

      【解决方案2】:

      relativedelta的文档

      请注意,如果计算的日期已经是Monday,例如,使用(0, 1)(0, -1) 不会更改日期。

      如果nthu 已经是星期四,那么添加TH(1)TH(-1) 不会产生任何效果,但会产生相同的日期,这就是您的循环无限运行的原因。

      我将假设一个月最多 5 周,并按照以下方式进行:

      todayte = datetime.today()
      cmon = todayte.month
      
      for i in range(1, 6):
          t = todayte + relativedelta(weekday=TH(i))
          if t.month != cmon:
              # since t is exceeded we need last one  which we can get by subtracting -2 since it is already a Thursday.
              t = t + relativedelta(weekday=TH(-2))
              break
      

      【讨论】:

        【解决方案3】:

        我认为这可能是最快的:

        end_of_month = datetime.datetime.today() + relativedelta(day=31)
        last_thursday = end_of_month + relativedelta(weekday=TH(-1))
        

        【讨论】:

          【解决方案4】:

          您应该将 2 传递给 TH 而不是 1,因为 1 不会改变任何东西。将您的代码修改为:

          while (nthu + relativedelta(weekday=TH(2))).month == cmon:
              nthu += relativedelta(weekday=TH(2))
          
          print nthu.strftime('%d-%b-%Y').upper()
          # prints 26-MAY-2016
          

          请注意,我修改了循环的条件以中断该月最后一天的出现,否则它将在下个月(在本例中为六月)中断。

          【讨论】:

          • 如果nthu 的初始值为23-MAY-2016,这将失败。或上周四同一周的任何一天。
          【解决方案5】:
          from datetime import datetime , timedelta
          
          todayte = datetime.today()
          cmon = todayte.month
          
          nthu = todayte
          while todayte.month == cmon:
              todayte += timedelta(days=1)
              if todayte.weekday()==3: #this is Thursday 
                  nthu = todayte
          print nthu
          

          【讨论】:

            【解决方案6】:

            您也可以使用calendar 包。 以monthcalendar 的形式访问日历。请注意,星期五是一周的最后一天。

            import calendar
            import datetime
            now = datetime.datetime.now()
            last_sunday = max(week[-1] for week in calendar.monthcalendar(now.year,
                                                                          now.month))
            print('{}-{}-{:2}'.format(now.year, calendar.month_abbr[now.month],
                                          last_sunday))
            

            【讨论】:

              【解决方案7】:

              根据亚当·斯密对How can I get the 3rd Friday of a month in Python?的回答,可以得到当月最后一个星期四的日期如下:

              import calendar
              import datetime
              
              def get_thursday(cal,year,month,thursday_number):
                  '''
                  For example, get_thursday(cal, 2017,8,0) returns (2017,8,3) 
                  because the first thursday of August 2017 is 2017-08-03
                  '''
                  monthcal = cal.monthdatescalendar(year, month)
                  selected_thursday = [day for week in monthcal for day in week if \
                                  day.weekday() == calendar.THURSDAY and \
                                  day.month == month][thursday_number]
                  return selected_thursday
              
              def main():
                  '''
                  Show the use of get_thursday()
                  '''
                  cal = calendar.Calendar(firstweekday=calendar.MONDAY)
                  today = datetime.datetime.today()
                  year = today.year
                  month = today.month
                  date = get_thursday(cal,year,month,-1) # -1 because we want the last Thursday 
                  print('date: {0}'.format(date)) # date: 2017-08-31        
              
              if __name__ == "__main__":
                  main()
              

              【讨论】:

                【解决方案8】:

                此代码可在 python 3.x 中用于查找当月的最后一个星期四。

                import datetime
                dt = datetime.datetime.today()
                def lastThurs(dt):
                    currDate, currMth, currYr = dt, dt.month, dt.year
                    for i in range(31):
                        if currDate.month == currMth and currDate.year == currYr and currDate.weekday() == 3:
                            #print('dt:'+ str(currDate))
                            lastThuDate = currDate
                        currDate += datetime.timedelta(1)
                
                    return lastThuDate
                

                【讨论】:

                  【解决方案9】:
                  import datetime
                  def get_thursday(_month,_year):
                      for _i in range(1,32):
                          if _i > 9:
                              _dateStr = str(_i)
                          else:
                              _dateStr = '0' + str(_i)
                          _date = str(_year) + '-' + str(_month) + '-' + _dateStr
                          try:
                              a = datetime.datetime.strptime(_date, "%Y-%m-%d").strftime('%a')
                          except:
                               continue
                          if a == 'Thu':
                              _lastThurs = _date
                      return _lastThurs
                  
                  x = get_thursday('05','2017')
                  print(x)
                  

                  【讨论】:

                  • 在回答一个老问题时,如果您包含一些上下文来解释您的答案如何提供帮助,那么您的答案将对其他 StackOverflow 用户更有用,特别是对于已经有一个已接受答案的问题。请参阅:How do I write a good answer
                  猜你喜欢
                  • 2022-12-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-19
                  • 1970-01-01
                  • 2016-01-26
                  • 2021-02-19
                  相关资源
                  最近更新 更多