Создание диапазона дат в Python
Я хочу создать список дат, начиная с сегодняшнего дня и возвращаясь на произвольное число дней, скажем, в моем примере — 100 дней. Есть ли способ сделать это более эффективно, чем представленный ниже код?
import datetime
a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
dateList.append(a - datetime.timedelta(days = x))
print dateList
5 ответ(ов)
Если вы хотите создать список дат, начиная с сегодняшнего дня и отнимая определённое количество дней (numdays
), вы можете использовать следующий код:
import datetime
base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]
Этот код инициализирует переменную base
с текущей датой и временем, а затем с помощью генератора списка создает date_list
, который содержит даты, начиная с сегодняшнего дня и заканчивая на numdays
дней назад.
Если у вас возникли вопросы или нужны уточнения, не стесняйтесь спрашивать!
Чтобы получить диапазон дат между заданной начальной и конечной датами, можно использовать следующий оптимизированный код на Python. Он не только эффективен по времени, но и по пространству:
import datetime
# Задаем начальные и конечные даты
start = datetime.datetime.strptime("21-06-2014", "%d-%m-%Y")
end = datetime.datetime.strptime("07-07-2014", "%d-%m-%Y")
# Генерируем список дат в заданном диапазоне
date_generated = [start + datetime.timedelta(days=x) for x in range((end - start).days + 1)]
# Выводим даты в нужном формате
for date in date_generated:
print(date.strftime("%d-%m-%Y"))
Пояснение:
- Мы используем
datetime
для работы с датами. strptime
позволяет преобразовать строки в объектыdatetime
.- Мы создаем список
date_generated
, используя генератор списков. Здесь(end - start).days + 1
гарантирует, что конечная дата включена в диапазон. timedelta
используется для добавления дней к начальной дате.- Наконец, мы форматируем и выводим каждую дату с помощью метода
strftime
.
Оптимизация:
- Использование генератора списков позволяет минимизировать количество строк кода и делает его более читаемым.
- Аккуратный подход с
timedelta
делает код более понятным и эффективным.
Вы можете написать генератор, который возвращает объекты даты, начиная с сегодняшнего дня:
import datetime
def date_generator():
from_date = datetime.datetime.today()
while True:
yield from_date
from_date = from_date - datetime.timedelta(days=1)
Этот генератор будет возвращать даты, начиная с сегодняшнего дня и двигаясь назад на один день за раз. Вот как получить первые 3 даты:
>>> import itertools
>>> dates = itertools.islice(date_generator(), 3)
>>> list(dates)
[datetime.datetime(2009, 6, 14, 19, 12, 21, 703890), datetime.datetime(2009, 6, 13, 19, 12, 21, 703890), datetime.datetime(2009, 6, 12, 19, 12, 21, 703890)]
Преимущество этого подхода по сравнению с циклом или списковым включением в том, что вы можете получать даты назад столько раз, сколько вам нужно.
Редактирование
Вот более компактная версия с использованием генераторного выражения вместо функции:
date_generator = (datetime.datetime.today() - datetime.timedelta(days=i) for i in itertools.count())
Использование:
>>> dates = itertools.islice(date_generator, 3)
>>> list(dates)
[datetime.datetime(2009, 6, 15, 1, 32, 37, 286765), datetime.datetime(2009, 6, 14, 1, 32, 37, 286836), datetime.datetime(2009, 6, 13, 1, 32, 37, 286859)]
Таким образом, вы можете легко генерировать даты в любом нужном вам диапазоне, используя данный подход.
Если использование внешних зависимостей приемлемо, рекомендую ознакомиться с библиотекой python-dateutil
, которая доступна по адресу https://pypi.org/project/python-dateutil, а также с модулем rrule
, который описан в документации: https://dateutil.readthedocs.io/en/stable/rrule.html.
Вот пример использования модуля rrule
:
from dateutil import rrule
from datetime import datetime
# Генерируем список из 100 дат, начиная с текущей даты, с ежедневной периодичностью
dates = list(rrule.rrule(rrule.DAILY, count=100, dtstart=datetime.now()))
Этот код создаст список из 100 последовательно дат, начиная с сегодняшнего дня и увеличивая на один день.
Вы можете упростить задачу, используя порядковые номера дней. Вот пример функции, которая генерирует диапазон дат:
def date_range(start_date, end_date):
for ordinal in range(start_date.toordinal(), end_date.toordinal()):
yield datetime.date.fromordinal(ordinal)
Также, как было указано в комментариях, вы можете создать список дат следующим образом:
date_range = [
datetime.date.fromordinal(ordinal)
for ordinal in range(
start_date.toordinal(),
end_date.toordinal(),
)
]
Оба способа позволяют удобно работать с диапазоном дат.
Преобразование даты в datetime в Python
Как получить день недели по заданной дате?
Как рассчитать количество дней между двумя заданными датами
Как вывести дату в стандартном формате?
Итерация по диапазону дат в Python