Как создать цикл от одной даты до другой с интервалом 30 минут
C помощью библиотеки Arrow сделал цикл через каждый час. А как сделать через каждые 30 мин?
from arrow import Arrow
start = datetime(2021, 3, 25, 0, 0)
end = datetime(2021, 3, 26, 0, 0)
for r in Arrow.range('hours', start, end):
...
Ответы (3 шт):
Автор решения: gil9red
→ Ссылка
Это можно сделать и через стандартный datetime используя timedelta
Например:
import datetime as DT
start = DT.datetime(2021, 3, 25, 0, 0)
end = DT.datetime(2021, 3, 26, 0, 0)
step = DT.timedelta(minutes=30)
date = start
while date <= end:
print(date)
date += step
Результат:
2021-03-25 00:00:00
2021-03-25 00:30:00
2021-03-25 01:00:00
...
2021-03-25 23:00:00
2021-03-25 23:30:00
2021-03-26 00:00:00
Автор решения: MaxU
→ Ссылка
Можно воспользоваться модулем Pandas:
import pandas as pd # pip install pandas
res = pd.date_range(start, end, freq="30min")
результат:
In [187]: res
Out[187]:
DatetimeIndex(['2021-03-25 00:00:00', '2021-03-25 00:30:00',
'2021-03-25 01:00:00', '2021-03-25 01:30:00',
'2021-03-25 02:00:00', '2021-03-25 02:30:00',
'2021-03-25 03:00:00', '2021-03-25 03:30:00',
'2021-03-25 04:00:00', '2021-03-25 04:30:00',
'2021-03-25 05:00:00', '2021-03-25 05:30:00',
'2021-03-25 06:00:00', '2021-03-25 06:30:00',
'2021-03-25 07:00:00', '2021-03-25 07:30:00',
'2021-03-25 08:00:00', '2021-03-25 08:30:00',
'2021-03-25 09:00:00', '2021-03-25 09:30:00',
'2021-03-25 10:00:00', '2021-03-25 10:30:00',
'2021-03-25 11:00:00', '2021-03-25 11:30:00',
'2021-03-25 12:00:00', '2021-03-25 12:30:00',
'2021-03-25 13:00:00', '2021-03-25 13:30:00',
'2021-03-25 14:00:00', '2021-03-25 14:30:00',
'2021-03-25 15:00:00', '2021-03-25 15:30:00',
'2021-03-25 16:00:00', '2021-03-25 16:30:00',
'2021-03-25 17:00:00', '2021-03-25 17:30:00',
'2021-03-25 18:00:00', '2021-03-25 18:30:00',
'2021-03-25 19:00:00', '2021-03-25 19:30:00',
'2021-03-25 20:00:00', '2021-03-25 20:30:00',
'2021-03-25 21:00:00', '2021-03-25 21:30:00',
'2021-03-25 22:00:00', '2021-03-25 22:30:00',
'2021-03-25 23:00:00', '2021-03-25 23:30:00',
'2021-03-26 00:00:00'],
dtype='datetime64[ns]', freq='30T')
результат можно легко преобразовать в список объектов datetime:
In [190]: res.to_pydatetime().tolist()
Out[190]:
[datetime.datetime(2021, 3, 25, 0, 0),
datetime.datetime(2021, 3, 25, 0, 30),
datetime.datetime(2021, 3, 25, 1, 0),
datetime.datetime(2021, 3, 25, 1, 30),
datetime.datetime(2021, 3, 25, 2, 0),
datetime.datetime(2021, 3, 25, 2, 30),
datetime.datetime(2021, 3, 25, 3, 0),
datetime.datetime(2021, 3, 25, 3, 30),
datetime.datetime(2021, 3, 25, 4, 0),
datetime.datetime(2021, 3, 25, 4, 30),
datetime.datetime(2021, 3, 25, 5, 0),
datetime.datetime(2021, 3, 25, 5, 30),
datetime.datetime(2021, 3, 25, 6, 0),
datetime.datetime(2021, 3, 25, 6, 30),
datetime.datetime(2021, 3, 25, 7, 0),
datetime.datetime(2021, 3, 25, 7, 30),
datetime.datetime(2021, 3, 25, 8, 0),
datetime.datetime(2021, 3, 25, 8, 30),
datetime.datetime(2021, 3, 25, 9, 0),
datetime.datetime(2021, 3, 25, 9, 30),
datetime.datetime(2021, 3, 25, 10, 0),
datetime.datetime(2021, 3, 25, 10, 30),
datetime.datetime(2021, 3, 25, 11, 0),
datetime.datetime(2021, 3, 25, 11, 30),
datetime.datetime(2021, 3, 25, 12, 0),
datetime.datetime(2021, 3, 25, 12, 30),
datetime.datetime(2021, 3, 25, 13, 0),
datetime.datetime(2021, 3, 25, 13, 30),
datetime.datetime(2021, 3, 25, 14, 0),
datetime.datetime(2021, 3, 25, 14, 30),
datetime.datetime(2021, 3, 25, 15, 0),
datetime.datetime(2021, 3, 25, 15, 30),
datetime.datetime(2021, 3, 25, 16, 0),
datetime.datetime(2021, 3, 25, 16, 30),
datetime.datetime(2021, 3, 25, 17, 0),
datetime.datetime(2021, 3, 25, 17, 30),
datetime.datetime(2021, 3, 25, 18, 0),
datetime.datetime(2021, 3, 25, 18, 30),
datetime.datetime(2021, 3, 25, 19, 0),
datetime.datetime(2021, 3, 25, 19, 30),
datetime.datetime(2021, 3, 25, 20, 0),
datetime.datetime(2021, 3, 25, 20, 30),
datetime.datetime(2021, 3, 25, 21, 0),
datetime.datetime(2021, 3, 25, 21, 30),
datetime.datetime(2021, 3, 25, 22, 0),
datetime.datetime(2021, 3, 25, 22, 30),
datetime.datetime(2021, 3, 25, 23, 0),
datetime.datetime(2021, 3, 25, 23, 30),
datetime.datetime(2021, 3, 26, 0, 0)]
Автор решения: CrazyElf
→ Ссылка
Ещё вариант для разнообразия. Не очень эффективный (генерируются лишние объекты datetime и потом выбрасываются), но зато на основе кода из вопроса, с небольшим дополнением в виде функции islice:
from arrow import Arrow
from datetime import datetime
from itertools import islice
start = datetime(2021, 3, 25, 0, 0)
end = datetime(2021, 3, 26, 0, 0)
for r in islice(Arrow.range('minute', start, end), None, None, 30):
print(r)
Вывод:
2021-03-25T00:00:00+00:00
2021-03-25T00:30:00+00:00
2021-03-25T01:00:00+00:00
...