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

使用python获取两个日期之间的周数

  •  4
  • Ludo  · 技术社区  · 8 年前

    我想找到最具python风格的方法来输出两个日期之间的周数列表。

    例如:

    输入

    start = datetime.date(2011, 12, 25) 
    end = datetime.date(2012, 1, 21)
    

    输出

    find_weeks(start, end)
    >> [201152, 201201, 201202, 201203]
    

    我一直在努力使用datetime库,但收效甚微

    4 回复  |  直到 8 年前
        1
  •  6
  •   Anton vBR    8 年前

    类似于( 更新: 删除了可读性较差的选项)

    import datetime
    
    def find_weeks(start,end):
        l = []
        for i in range((end-start).days + 1):
            d = (start+datetime.timedelta(days=i)).isocalendar()[:2] # e.g. (2011, 52)
            yearweek = '{}{:02}'.format(*d) # e.g. "201152"
            l.append(yearweek)
        return sorted(set(l))
    
    start = datetime.date(2011, 12, 25) 
    end = datetime.date(2012, 1, 21)
    
    print(find_weeks(start,end)[1:]) # [1:] to exclude first week.
    

    退换商品

    ['201152', '201201', '201202', '201203']
    

    要包括第一周(201151),只需删除 [1:] 函数调用后

        2
  •  3
  •   asongtoruin    8 年前

    .isocalendar() 这里是您的朋友-它返回一个元组 (year, week of year, day of week) . 我们使用它将开始日期重置为eweek的开始日期,然后每次增加一周,直到我们通过结束日期:

    import datetime
    
    
    def find_weeks(start_date, end_date):
        subtract_days = start_date.isocalendar()[2] - 1
        current_date = start_date + datetime.timedelta(days=7-subtract_days)
        weeks_between = []
        while current_date <= end_date:
            weeks_between.append(
                '{}{:02d}'.format(*current_date.isocalendar()[:2])
            )
            current_date += datetime.timedelta(days=7)
        return weeks_between
    
    start = datetime.date(2011, 12, 25)
    end = datetime.date(2012, 1, 21)
    
    print(find_weeks(start, end))
    

    这张照片

    ['201152', '201201', '201202', '201203']
    
        3
  •  3
  •   Anton vBR    8 年前

    使用熊猫

    import pandas as pd
    
    dates=pd.date_range(start=start,end=end,freq='W')
    date_index=dates.year.astype(str)+dates.weekofyear.astype(str).str.zfill(2)
    date_index.tolist()
    
        4
  •  0
  •   Laurent H. chthonicdaemon    8 年前

    我建议您使用以下易于阅读的解决方案:

    import datetime
    
    start = datetime.date(2011, 12, 25) 
    end = datetime.date(2012, 1, 21)
    
    def find_weeks(start, end):
        l = []
        while (start.isocalendar()[1] != end.isocalendar()[1]) or (start.year != end.year):
            l.append(start.isocalendar()[1] + 100*start.year)
            start += datetime.timedelta(7)
        l.append(start.isocalendar()[1] + 100*start.year)
        return (l[1:])
    
    
    print(find_weeks(start, end))
    
    >> [201252, 201201, 201202, 201203]