11

所以我有一个脚本,其中包含不同函数的日期参数,我希望它循环01-01-201206-09-2012不包括周末。我试图找出一种可以使用时间增量的方法,因为我的脚本输出的文件带有文件名中使用的日期,例如:

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。项目的日期参数的格式也为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我无法弄清楚如何排除周末以及如何让它以正确的顺序循环

谢谢

4

3 回答 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
于 2012-06-11T17:35:09.577 回答
2

freq = 'B'使用for有更简单的方法来做到这一点 business day frequency

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

您还可以通过以下方式检查日期名称:

dt.weekday_name

Index(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Monday',
       'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
      dtype='object')
于 2018-08-13T06:13:52.837 回答
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
于 2016-09-28T01:40:18.443 回答