【问题标题】:How can I get the current week using Python?如何使用 Python 获取当前周?
【发布时间】:2010-01-05 02:42:57
【问题描述】:

使用 Python...

如何获取特定一周中的天数列表?

类似...

{
'1' : ['01/03/2010','01/04/2010','01/05/2010','01/06/2010','01/07/2010','01/08/2010','01/09/2010'],  
'2' : ['01/10/2010','01/11/2010','01/12/2010','01/13/2010','01/14/2010','01/15/2010','01/16/2010'] 
}

本例中字典的键是周数。

【问题讨论】:

  • 每天循环,询问星期几 - 附加到正确的列表中。
  • 参见来自同一个人的非常相似的问题:stackoverflow.com/questions/2003870/…
  • 知道您想要字典的用途会很有帮助。

标签: python datetime calendar


【解决方案1】:
current_week = datetime.datetime.now().isocalendar()[1]

【讨论】:

  • 这仅获取“周数”,不满足 OP 的要求。
【解决方案2】:

阅读该问题后,我开发了一种 3 行方法:

from datetime import timedelta

def get_week_dates(base_date, start_day, end_day=None):
    """
    Return entire week of dates based on given date limited by start_day and end_day.
    If end_day is None, return only start_day.

    >>> from datetime import date
    >>> get_week_dates(date(2015,1,16), 3, 5)
    [datetime.date(2015, 1, 14), datetime.date(2015, 1, 15), datetime.date(2015, 1, 16)]

    >>> get_week_dates(date(2015,1,15), 2, 5)
    [datetime.date(2015, 1, 13), datetime.date(2015, 1, 14), datetime.date(2015, 1, 15), datetime.date(2015, 1, 16)]
    """
    monday = base_date - timedelta(days=base_date.isoweekday() - 1)
    week_dates = [monday + timedelta(days=i) for i in range(7)]
    return week_dates[start_day - 1:end_day or start_day]

使用get_week_dates(date.today(), 1, 7) 获取当前星期日期。

【讨论】:

    【解决方案3】:

    这里有一些代码:

    import datetime
    
    now = datetime.datetime.now()
    
    now_day_1 = now - datetime.timedelta(days=now.weekday())
    
    dates = {}
    
    for n_week in range(3):
        dates[n_week] = [(now_day_1 + datetime.timedelta(days=d+n_week*7)).strftime("%m/%d/%Y") for d in range(7)]
    
    print dates
    

    打印:

    {
     0: ['01/04/2010', '01/05/2010', '01/06/2010', '01/07/2010', '01/08/2010', '01/09/2010', '01/10/2010'], 
     1: ['01/11/2010', '01/12/2010', '01/13/2010', '01/14/2010', '01/15/2010', '01/16/2010', '01/17/2010'], 
     2: ['01/18/2010', '01/19/2010', '01/20/2010', '01/21/2010', '01/22/2010', '01/23/2010', '01/24/2010']
    }
    

    【讨论】:

    • 他将星期日作为一周的第一天。
    【解决方案4】:

    小心!如果你想定义你自己的周数,你可以使用 in your first question 提供的生成器表达式,顺便说一下,得到了一个很棒的答案)。如果您想遵循 ISO 约定的周数,则需要小心:

    一年的第一个日历周是 包括第一个的那个 那年的星期四和 [...] 一个日历年的最后一个日历周 是紧接前一周 下一个日历周的第一个日历周 日历年。

    例如,2010 年 1 月 1 日和 2 日不是 2010 年的第一周,而是 2009 年的第 53 周。

    Python 提供了一个使用 ISO 日历查找周数的模块:

    示例代码:

    h[1] >>> import datetime
    h[1] >>> Jan1st = datetime.date(2010,1,1)
    h[1] >>> Year,WeekNum,DOW = Jan1st.isocalendar() # DOW = day of week
    h[1] >>> print Year,WeekNum,DOW
    2009 53 5
    

    再次注意,2010 年 1 月 1 日对应于 2009 年的第 53 周。

    使用上一个答案中提供的生成器:

    from datetime import date, timedelta
    
    
    def allsundays(year):
        """This code was provided in the previous answer! It's not mine!"""
        d = date(year, 1, 1)                    # January 1st                                                          
        d += timedelta(days = 6 - d.weekday())  # First Sunday                                                         
        while d.year == year:
            yield d
            d += timedelta(days = 7)
    
    Dict = {}
    for wn,d in enumerate(allsundays(2010)):
        # This is my only contribution!
        Dict[wn+1] = [(d + timedelta(days=k)).isoformat() for k in range(0,7) ]
    
    print Dict
    

    Dict 包含您请求的字典。

    【讨论】:

      【解决方案5】:

      您如何确定周数?在这里,我使用该周中的星期天(您在示例中使用的)的函数来确定该周中的一天,然后返回它加上接下来的 6 天。

      import datetime
      
      one_day = datetime.timedelta(days=1)
      
      def get_week(date):
        """Return the full week (Sunday first) of the week containing the given date.
      
        'date' may be a datetime or date instance (the same type is returned).
        """
        day_idx = (date.weekday() + 1) % 7  # turn sunday into 0, monday into 1, etc.
        sunday = date - datetime.timedelta(days=day_idx)
        date = sunday
        for n in xrange(7):
          yield date
          date += one_day
      
      print list(get_week(datetime.datetime.now().date()))
      # [datetime.date(2010, 1, 3), datetime.date(2010, 1, 4),
      #  datetime.date(2010, 1, 5), datetime.date(2010, 1, 6),
      #  datetime.date(2010, 1, 7), datetime.date(2010, 1, 8),
      #  datetime.date(2010, 1, 9)]
      print [d.isoformat() for d in get_week(datetime.datetime.now().date())]
      # ['2010-01-03', '2010-01-04', '2010-01-05', '2010-01-06', '2010-01-07',
      #  '2010-01-08', '2010-01-09']
      

      【讨论】:

      • 我最喜欢这个答案,因为它最符合我的要求。我想知道对于给定的(当前日期)什么是一周的开始和结束。可能在 2010 年就已经解决了。投赞成票是不是断章取义。
      • 当您需要将星期日作为一周的第一天时,这是最好的解决方案,谢谢!
      【解决方案6】:

      您可以使用 datetime 模块。您可以指定格式和所有内容。这是链接:http://docs.python.org/library/datetime.html

      查看 datetime.datetime(params) 和 datetime.timedelta(params)。希望一切顺利;-)

      例子:

      import datetime
      
      numweeks = 5
      start_date = datetime.datetime(year=2010,month=1,day=4)    
      
      weeks = {}
      
      offset = datetime.timedelta(days=0)
      for week in range(numweeks):
         this_week = []
         for day in range(7):
              date = start_date + offset
              date = date.strftime( some_format_string )
              this_week.append( date )
              offset += datetime.timedelta(days=1)
         weeks[week] = this_week 
      

      【讨论】:

      • 我知道 datetime 模块。我还没有找到一个很好/干净/好的方法来做到这一点。希望有人已经遇到过这个问题或有一些具体的见解。
      • 一般来说,处理日期/时间永远不会干净:(
      • 发布了一个例子(未经测试)。我希望它有所帮助:-)
      【解决方案7】:

      如果您对 ISO 标准满意:

      >>> import collections
      >>> dd = collections.defaultdict(list)
      >>> jan1 = datetime.date(2010, 1, 1)
      >>> oneday = datetime.timedelta(days=1)
      >>> allyear = [jan1 + k*oneday for k in range(365 + 6)]
      >>> for d in allyear:
      ...   y, w, wd = d.isocalendar()
      ...   if y == 2010: dd[w].append(d.strftime('%m/%d/%Y'))
      ... 
      

      这会产生与您正在寻找的结果稍有不同的结果(根据 ISO 标准,周从星期一开始,而不是星期日...),例如:

      >>> dd[1]
      ['01/04/2010', '01/05/2010', '01/06/2010', '01/07/01/2010', '01/08/2010', '01/09/2010', '01/10/2010']
      

      但是你可以通过模拟一个适当的“off by one”错误来调整它!-)

      calendar 模块允许您将任何工作日设置为“一周的第一天”,但没有提供获取所有周的简单方法(当一周分为两个月时不会重复),所以我认为直接下班datetime 可能是一个更好的主意。

      【讨论】:

        猜你喜欢
        • 2022-12-07
        • 1970-01-01
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        相关资源
        最近更新 更多