Как получить список дат для l oop по началу и концу? - PullRequest
0 голосов
/ 04 августа 2020

Я хочу получить список уникальных yyyy-mm-01 для диапазона между начальной и конечной датами, используя a для l oop. Это код, который у меня есть:

import datetime
from datetime import timedelta, date

start=date(2017,4,1)
end=(datetime.date.today().replace(day=1)) - datetime.timedelta(days=1) #last completed month

def daterange(start, end):
    for n in range(int((end - start).days)):
        yield start + timedelta(n)

for single_date in daterange(start, end):
    myset = str(single_date.strftime("%Y-%m-01"))
    print(myset)

The issue is that my result looks like this:
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-04-01
2017-05-01

Я пробовал добавить set (), но он по-прежнему показывает повторяющиеся даты. Как мне решить эту проблему?

Ответы [ 4 ]

0 голосов
/ 04 августа 2020

Я настоятельно рекомендую вам использовать модуль dateutils для получения таких повторяющихся дат. Вы можете установить его с помощью cmd pip install python-dateutil

>>> from dateutil.rrule import rrule, MONTHLY
>>>
>>> start=date(2017,4,1)
>>> end=(datetime.date.today().replace(day=1)) - datetime.timedelta(days=1)
>>> res = list(d.strftime("%Y-%m-%d") for d in rrule(dtstart=start, until=end, freq=MONTHLY))
>>> pprint(res)
['2017-04-01',
 '2017-05-01',
 '2017-06-01',
 '2017-07-01',
 '2017-08-01',
 '2017-09-01',
 '2017-10-01',
 '2017-11-01',
 '2017-12-01',
 '2018-01-01',
 '2018-02-01',
 '2018-03-01',
 '2018-04-01',
 '2018-05-01',
 '2018-06-01',
 '2018-07-01',
 '2018-08-01',
 '2018-09-01',
 '2018-10-01',
 '2018-11-01',
 '2018-12-01',
 '2019-01-01',
 '2019-02-01',
 '2019-03-01',
 '2019-04-01',
 '2019-05-01',
 '2019-06-01',
 '2019-07-01',
 '2019-08-01',
 '2019-09-01',
 '2019-10-01',
 '2019-11-01',
 '2019-12-01',
 '2020-01-01',
 '2020-02-01',
 '2020-03-01',
 '2020-04-01',
 '2020-05-01',
 '2020-06-01',
 '2020-07-01']

0 голосов
/ 04 августа 2020

Проблема в том, что вы фактически не используете свой набор, чтобы проверить, видели ли вы дату раньше:

myset = set()
for single_date in daterange(start, end):
    mydate = str(single_date.strftime("%Y-%m-01"))
    if mydate not in myset:
        print(mydate)
        myset.add(mydate)
0 голосов
/ 04 августа 2020
import datetime
from datetime import timedelta, date
from dateutil.relativedelta import relativedelta

start=date(2017,4,1)
end=(datetime.date.today().replace(day=1)) - datetime.timedelta(days=1) #last completed month

lst = []
current_date = start
while current_date < end:
    current_date = current_date.replace(day=1) + relativedelta(months=1)
    lst.append(current_date)

print(lst)
0 голосов
/ 04 августа 2020
dates = set()
for single_date in daterange(start, end):
    dates.add(single_date.strftime("%Y-%m-01"))

print(sorted(list(dates)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...