循环遍历日期,但排除周末

11

我有一个脚本,其中包含不同函数的日期参数,并且我希望它循环遍历从2012年1月1日2012年6月9日之间的日期但排除周末。我正在尝试找出一种方法可以使用时间差,因为我的脚本会输出以文件名中使用的日期命名的文件,例如:

items = (functions.getItems(item,date)
    print items
    test = sum(abs(l[-1]) for l in items)
    total = open('total' +str(datetime.today- datetime.timedelta(1)),'a')

我希望timedelta(1)能够循环遍历每个日期,以便输出文件的格式为total2012-01-01的第一天,并一直循环到创建文件 total2012-06-09 。此外,items的日期参数的格式为MM-DD-YYYY

我认为我可以这样做:

sd = 01-01-2012
ed = 06-09-2012
delta = datetime.timedelta(days=1)
diff = 0
while sd != ed
    # do functions 
    # (have output files (datetime.today - datetime.delta(diff))
    diff +=1
    sd+=delta

我需要循环遍历从 01-01-2012 开始到 06-10-2012 结束的日期,但要排除周末。我不知道如何排除周末,并且如何按正确的顺序进行循环。

谢谢。


3
请避免使用 MM-DD-YYYY 的日期格式。由于元素未按照大小顺序递增或递减,因此这种格式非常容易令人困惑。此外,很容易将其与 ISO 标准 YYYY-MM-DD 之后最合理的日期格式 DD-MM-YYYY 混淆。请注意不改变原文意思,使翻译更加通俗易懂。 - Celada
我同意@Celada的观点,如果可能的话,请使用ISO格式。如果不可能,请使用“/”而不是“-”作为分隔符以减少混淆。 - Mark Ransom
3个回答

18
使用 datetime.weekday() 方法。它返回介于零和六之间的值,与工作日有关。星期六的值为5,星期天的值为6;因此,如果遇到这些值时跳过操作,则可以跳过周末:
start = datetime(2012, 1, 1)
end = datetime(2012, 10, 6)
delta = timedelta(days=1)
d = start
diff = 0
weekend = set([5, 6])
while d <= end:
    if d.weekday() not in weekend:
        diff += 1
    d += delta

它报错了,亲爱的,显示'TypeError:'module' object is not callable'。 - Priyan RockZ
2
@PriyanRockZ 你可能是用了 import datetime 的方式导入它。尝试使用 from datetime import datetime 的方式导入它。 - brandizzi
@mrbTT的文档说明星期一是0,星期天是6,与Python 2相同。当然,我们可以随时测试它,但我想知道为什么他们会改变这个,特别是倒数计算天数 :) - brandizzi

4

使用freq = 'B'来表示工作日频率是更简单的做法。

import pandas as pd
dt = pd.date_range(start=datetime.date.today(), periods=10, freq='B')
dt

这将为您提供:

DatetimeIndex(['2018-08-13', '2018-08-14', '2018-08-15', '2018-08-16',
               '2018-08-17', '2018-08-20', '2018-08-21', '2018-08-22',
               '2018-08-23', '2018-08-24'],
              dtype='datetime64[ns]', freq='B')

you check name of day also by:

dt.weekday_name

Index(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Monday',
       'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
      dtype='object')

1
好的答案。请注意,.date_range() 返回 DatetimeIndex。要将其转换为日期时间,请调用结果 DatetimeIndex.to_pydatetime() 方法。 - ChaimG

1

@brandizzi的回答在句法上更加美观,但你也可以使用以下方法作为替代

start = datetime(2012, 1, 1)
end = datetime(2012, 10, 6)
delta = timedelta(days=1)
d = start
diff = 0
SATURDAY = 5
while d <= end:
    if d.weekday() < SATURDAY:
        diff += 1
        d += delta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接