6

Создание диапазона дат в Python

16

Я хочу создать список дат, начиная с сегодняшнего дня и возвращаясь на произвольное число дней, скажем, в моем примере — 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 ответ(ов)

7

Если вы хотите создать список дат, начиная с сегодняшнего дня и отнимая определённое количество дней (numdays), вы можете использовать следующий код:

import datetime

base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]

Этот код инициализирует переменную base с текущей датой и временем, а затем с помощью генератора списка создает date_list, который содержит даты, начиная с сегодняшнего дня и заканчивая на numdays дней назад.

Если у вас возникли вопросы или нужны уточнения, не стесняйтесь спрашивать!

1

Чтобы получить диапазон дат между заданной начальной и конечной датами, можно использовать следующий оптимизированный код на 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"))

Пояснение:

  1. Мы используем datetime для работы с датами.
  2. strptime позволяет преобразовать строки в объекты datetime.
  3. Мы создаем список date_generated, используя генератор списков. Здесь (end - start).days + 1 гарантирует, что конечная дата включена в диапазон.
  4. timedelta используется для добавления дней к начальной дате.
  5. Наконец, мы форматируем и выводим каждую дату с помощью метода strftime.

Оптимизация:

  • Использование генератора списков позволяет минимизировать количество строк кода и делает его более читаемым.
  • Аккуратный подход с timedelta делает код более понятным и эффективным.
0

Вы можете написать генератор, который возвращает объекты даты, начиная с сегодняшнего дня:

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

Таким образом, вы можете легко генерировать даты в любом нужном вам диапазоне, используя данный подход.

0

Если использование внешних зависимостей приемлемо, рекомендую ознакомиться с библиотекой 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 последовательно дат, начиная с сегодняшнего дня и увеличивая на один день.

0

Вы можете упростить задачу, используя порядковые номера дней. Вот пример функции, которая генерирует диапазон дат:

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(),
    )
]

Оба способа позволяют удобно работать с диапазоном дат.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь