【问题标题】:how to get all dates of week based on week number in python如何根据python中的周数获取一周的所有日期
【发布时间】:2019-05-16 07:25:28
【问题描述】:

我想要基于周数的本周所有日期。

我可以得到周数

import datetime
weeknum=datetime.datetime.now().isocalendar()[1]

结果是 20。

想要第 20 周的所有日期。 最终输出应该是

dates=['2019-05-12','2019-05-13','2019-05-14','2019-05-15','2019-05-16','2019-05-17','2019-05-18']

请帮帮我。

【问题讨论】:

    标签: python python-2.7 datetime


    【解决方案1】:

    您可以使用timedatetime 以及this 回答建议但将其更改为您的要求:

    WEEK  = 20 - 2 # as it starts with 0 and you want week to start from sunday
    startdate = time.asctime(time.strptime('2019 %d 0' % WEEK, '%Y %W %w')) 
    startdate = datetime.datetime.strptime(startdate, '%a %b %d %H:%M:%S %Y') 
    dates = [startdate.strftime('%Y-%m-%d')] 
    for i in range(1, 7): 
        day = startdate + datetime.timedelta(days=i)
        dates.append(day.strftime('%Y-%m-%d')) 
    

    输出如下:

    dates = ['2019-05-12',
             '2019-05-13',
             '2019-05-14',
             '2019-05-15',
             '2019-05-16',
             '2019-05-17',
             '2019-05-18']
    

    【讨论】:

    • 为什么需要与字符串相互转换?只需将其保存在日期时间/日期对象中
    • @Will 因为它是返回字符串列表的要求之一。
    • 好的。问题和示例有点模棱两可。 OP 想提供周数,但在示例中也使用 datetime.now()。
    【解决方案2】:

    使用 timedelta 和列表推导。

    import datetime
    theday = datetime.date.today()
    weekday = theday.isoweekday()
    # The start of the week
    start = theday - datetime.timedelta(days=weekday)
    # build a simple range
    dates = [start + datetime.timedelta(days=d) for d in range(7)]
    

    获取字符串输出

    dates = [str(d) for d in dates]
    

    【讨论】:

      【解决方案3】:
      import datetime
      
      # Starts with knowing the day of the week
      week_day=datetime.datetime.now().isocalendar()[2]
      
      # Calculates Starting date (Sunday) for this case by subtracting current date with time delta of the day of the week
      start_date=datetime.datetime.now() - datetime.timedelta(days=week_day)
      
      # Prints the list of dates in a current week
      dates=[str((start_date + datetime.timedelta(days=i)).date()) for i in range(7)]
      dates
      

      输出是:

      >>> dates
      ['2019-05-12', '2019-05-13', '2019-05-14', '2019-05-15', '2019-05-16', '2019-05-17', '2019-05-18']
      

      希望这可以帮助你。祝你今天过得愉快。 :D

      【讨论】:

        【解决方案4】:

        我会看看以下两个问题。第一个应该可以帮助您计算给定周数的开始日期 - 不要忘记指定您的年份。

        Get date from week number

        然后我会使用下面的答案,而不是使用开始/结束日期,而是使用上面的开始日期并添加 1 天; 6 次并将每个新日期存储在一个数组中。

        Python: give start and end of week data from a given date

        【讨论】:

          【解决方案5】:

          你能做的就是这个-

          weekdates = []
          week_number = datetime.datetime.now().isocalendar()[1]
          for day in range(7):
              week_date = datetime.datetime.strptime("2019-W{}".format(week_number)+ '-{}'.format(day), "%Y-W%W-%w")
              weekdates.append(week_date)
          

          这样做是利用日期格式转换来根据星期几构造一个日期。

          希望这会有所帮助。

          【讨论】:

          • 其显示错误如下 ValueError: time data '2019-W20-7' does not match format '%Y-W%W-%w'
          • 等一下,让我看看
          【解决方案6】:

          对于那些需要输出日期从星期一开始的人,可以像这样调整它:

          import time
          import datetime
          
          WEEK  = 20 - 1 # as it starts with 0 and you want week to start from sunday
          startdate = time.asctime(time.strptime('2019 %d 1' % WEEK, '%Y %W %w')) 
          startdate = datetime.datetime.strptime(startdate, '%a %b %d %H:%M:%S %Y') 
          dates = [startdate.strftime('%Y-%m-%d')] 
          for i in range(1, 7): 
              day = startdate + datetime.timedelta(days=i)
              dates.append(day.strftime('%Y-%m-%d'))
          print(dates)
          

          【讨论】:

            【解决方案7】:

            将前 14 天、当天和后 14 天作为候选人。最后,检查哪个日期的周数与当前的周数相似:

            import datetime
            
            def week_to_dates():
                date = datetime.date.today()
                week = date.strftime("%V")
            
                candidates = [date - datetime.timedelta(days=k) for k in range(14, 0, -1)] + \
                             [date] + \
                             [date + datetime.timedelta(days=k) for k in range(1, 15)]
                return [candidate.strftime('%Y-%m-%d') for candidate in candidates if candidate.strftime("%V") == week]
            

            【讨论】:

            • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
            猜你喜欢
            • 2023-01-12
            • 1970-01-01
            • 1970-01-01
            • 2019-04-13
            • 2021-12-31
            • 1970-01-01
            • 1970-01-01
            • 2021-12-31
            相关资源
            最近更新 更多