Вопрос по datetime, loops, python – Циклические даты, кроме выходных

10

Итак, у меня есть скрипт, который имеет аргументы даты для различных функций, и я хочу, чтобы он прошел через01-01-2012 в06-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 исключая выходные. У меня возникли проблемы с выяснением того, как исключить выходные и как сделать так, чтобы они зацикливались в правильном порядке.

Спасибо

Я согласен с @Celada, используйте формат ISO, если это возможно. Если это невозможно, используйте/ вместо- в качестве разделителя, чтобы уменьшить путаницу. Mark Ransom
Пожалуйста, избегайте использования дат в формате ММ-ДД-ГГГГ. Это очень сбивает с толку, поскольку элементы не растут и не убывают. Кроме того, его легко смешать с DD-MM-YYYY, который является вторым наиболее приемлемым форматом даты после стандарта ISO YYYY-MM-DD. Celada

Ваш Ответ

3   ответа
15

datetime.weekday() метод. Возвращает значения от нуля до шести, относящиеся к дням недели. Значение субботы 5, а значение воскресенья 6; Итак, если вы пропустите операцию, когда появятся эти значения, вы пропустите Weekdends:

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
спасибо дорогой друг brandizzi.its решил :-)
@PriyanRockZ вы, вероятно, импортировали его какimport datetime, Попробуй использоватьfrom datetime import datetime вместо.
это выдает эту ошибку уважаемый «Ошибка типа:« модуль » объект не может быть вызван & apos;
Документация @mrbTT гласитMonday is 0 and Sunday is 6,same as Python 2, Конечно, мы всегда можем это проверить, но мне интересно, почему они это изменили бы, особенно если считать дни назад :)
2

freq = 'B' за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')
2

но в качестве альтернативы вы можете использовать следующее

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

Похожие вопросы