代码之家  ›  专栏  ›  技术社区  ›  rmontgomery429

如何使用python获得本周的内容?

  •  11
  • rmontgomery429  · 技术社区  · 15 年前

    使用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'] 
    }
    

    本例中字典的键是周数。

    7 回复  |  直到 15 年前
        1
  •  17
  •   Community Jaime Torres    7 年前

    当心!如果要定义自己的周数,可以使用提供的生成器表达式 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包含您请求的词典。

        2
  •  4
  •   Roger Pate    15 年前

    你如何确定周数?在这里,我用一个函数来标识一周中的某一天,这个函数得到一周中的星期日(您在示例中使用的),然后返回它加上接下来的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']
    
        3
  •  1
  •   SapphireSun    15 年前

    您可以使用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 
    
        4
  •  1
  •   Alex Martelli    15 年前

    如果您同意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']
    

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

    这个 calendar 模块允许您将任何工作日设置为“每周的第一天”,但没有简单的方法来获取所有的周(当一周被拆分为两个月时,不需要重复),因此我认为直接工作 datetime 可能是个更好的主意。

        5
  •  1
  •   chronossc    9 年前

    在读过这个问题之后,我开发了一个三行的方法:

    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) 获取当前周日期。

        6
  •  0
  •   Ned Batchelder    15 年前

    下面是一些代码:

    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']
    }
    
        7
  •  -1
  •   Paul Roub Mark Dail    7 年前
    current_week = datetime.datetime.now().isocalendar()[1]