Skip to main content
 首页 » 编程设计

python之每个工作日在两个日期之间出现的次数

2025年05月04日11虾米哥

在 Python 中,假设我们有两个日期:

date_from = datetime.date(2014,02,8) 
date_to   = datetime.date(2014,12,9) 

我们需要计算这两天之间一周中每个工作日出现的次数。解决这个问题的好方法是什么?

例如,如果我们有:

date_from = datetime.date(2014,11,30) # Sunday 
date_to   = datetime.date(2014,12,9)  # Tuesday 

我正在寻找的答案是(星期几以字符串或数字形式)是:

'Sunday': 2 
'Monday': 2 
'Tuesday': 2 
'Wednesday': 1 
'Thursday': 1 
'Friday': 1 
'Saturday': 1 

请您参考如下方法:

试试这个:

>>> from collections import Counter 
>>> weekdays = Counter() 
 
>>> date_from = datetime.date(2014,11,30) # Sunday 
>>> date_to   = datetime.date(2014,12,9)  # Tuesday 
 
>>> for i in range((date_to - date_from).days+1): 
...    weekdays[(date_from + datetime.timedelta(i))\ 
...                                  .strftime('%a')] += 1 
 
>>> weekdays 
Counter({'Sun': 2, 'Tue': 2, 'Mon': 2, 'Wed': 1, 'Fri': 1,  
         'Thu': 1, 'Sat': 1}) 

另一个镜头:

def dates_between(start, end): 
    while start <= end: 
        yield start 
        start += datetime.timedelta(1) 
 
def count_weekday(start, end): 
    counter = Counter() 
    for date in dates_between(start, end): 
        counter[date.strftime('%a')] += 1 
    return counter 

然后:

>>> count_weekday(date_from, date_to) 
Counter({ 
    'Sun': 2,  
    'Tue': 2,  
    'Mon': 2,  
    'Wed': 1,  
    'Fri': 1,  
    'Thu': 1,  
    'Sat': 1 
}) 

[更新]

Mark Ransom 评论道:

There's really no need to count every single day individually. ... I've already given upvotes to the people who did it better.

我敢肯定还有很多其他方法可以达到相同的结果,但有什么意义呢?也许有人担心性能。我不是 - 因为:

  • O(n) 和 O(n log n) 之间的差异与较小的 n 值无关。
  • 正如可敬的 Donald Knuth 所说:“过早的优化是万恶之源”。
  • 关于性能问题的答案总是“对其进行分析”——我不止一次对结果如此不直观感到惊讶。

并且在分析之后,即使其他算法快了几毫秒:

  • 性能差异是否与应用相关?
  • 代码更容易推理吗?
  • 你能确保涵盖所有极端情况吗?

我大部分时间都愿意在原始性能和更简单的设计之间进行权衡。