【问题标题】:Get the week numbers between two dates with python使用python获取两个日期之间的星期数
【发布时间】:2018-02-22 12:30:00
【问题描述】:

我想找到最pythonic的方式来输出两个日期之间的周数列表。

例如:

输入

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

输出

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

我一直在努力使用日期时间库,但收效甚微

【问题讨论】:

  • 你能提供一个你迄今为止尝试过的例子吗?

标签: python datetime timedelta rrule


【解决方案1】:

update: 删除了可读性较差的选项)

行中的某些内容
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:]

【讨论】:

  • 有趣的方法!似乎是 OP 要求的“更 Pythonic”的版本,+1
  • @ason​​gtoruin 谢谢。你也有一些不错的事情,但我认为只使用所有天和 set() 更安全。
  • 谢谢两位。可能更 Pythonic 的是将它变成一个单行列表理解。但更难理解发生了什么。
  • @Ludo 一开始我有一个列表理解,但是当它不能容纳一行时,我认为它不再是 pythonic(可读性第一!)。鉴于此,我将格式行分开。
  • @Ludo 是“Pythonic”不一定是万能的。可读性也很重要——我认为这个答案既简洁又易于理解。
【解决方案2】:

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

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】:

    使用熊猫

    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()
    

    【讨论】:

    • 我喜欢 pandas 格式的解决方案以提高可读性,但运行速度比 datetime 解决方案慢: datetime: 46.9 µs ± 442 ns per loop(平均值±标准差,7 次运行,每次 10000 次循环)pandas :每个循环 883 µs ± 30.1 µs(平均值 ± 标准偏差。7 次运行,每次 1000 个循环)
    • 我改变了格式...但是这个解决方案仍然不包括上周。
    【解决方案4】:

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

    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]
    

    【讨论】:

      猜你喜欢
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 2017-05-02
      • 2011-06-25
      • 1970-01-01
      相关资源
      最近更新 更多