У меня есть следующий код, чтобы сделать это, но как я могу сделать это лучше? Прямо сейчас я думаю, что это лучше, чем вложенные циклы, но он начинает получать Perl-one-linerish, когда у вас есть генератор в понимании списка.
day_count = (end_date - start_date).days + 1
for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count)) if d <= end_date]:
print strftime("%Y-%m-%d", single_date.timetuple())
Ноты
- Я на самом деле не использую это для печати. Это только для демонстрационных целей.
start_date
Иend_date
переменные являютсяdatetime.date
объектами , потому что не нужны временные метки. (Они будут использоваться для создания отчета).
Пример вывода
Для даты начала 2009-05-30
и даты окончания 2009-06-09
:
2009-05-30
2009-05-31
2009-06-01
2009-06-02
2009-06-03
2009-06-04
2009-06-05
2009-06-06
2009-06-07
2009-06-08
2009-06-09
Ответы:
Почему есть две вложенные итерации? Для меня это производит тот же список данных только с одной итерацией:
И никакой список не сохраняется, только один генератор повторяется. Также «если» в генераторе кажется ненужным.
В конце концов, линейная последовательность должна требовать только одного итератора, а не двух.
Обновление после обсуждения с Джоном Мачином:
Возможно, наиболее элегантное решение - использовать функцию генератора, чтобы полностью скрыть / абстрагировать итерацию в диапазоне дат:
Примечание: для согласованности со встроенной
range()
функцией эта итерация останавливается до достиженияend_date
. Так что для инклюзивной итерации используйте следующий день, как вы бы это сделалиrange()
.источник
(start_date + datetime.timedelta(n) for n in range((end_date - start_date).days))
Это может быть более понятно:
источник
Используйте
dateutil
библиотеку:Эта библиотека Python имеет много более продвинутых функций, некоторые очень полезные, такие как
relative delta
s, и реализована в виде одного файла (модуля), который легко включается в проект.источник
until
то время как окончательная датаdaterange
методы в ответе Бера является эксклюзивной изend_date
.Панды отлично подходят для временных рядов в целом и имеют прямую поддержку диапазонов дат.
Затем вы можете зациклить диапазон дат, чтобы напечатать дату:
У этого также есть много вариантов, чтобы сделать жизнь легче. Например, если вы хотите только будние дни, вы просто должны поменяться местами в bdate_range. См. Http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps.
Сила Pandas в действительности заключается в ее структурах данных, которые поддерживают векторизованные операции (очень похожие на numpy), которые делают операции с большими объемами данных очень быстрыми и легкими.
РЕДАКТИРОВАТЬ: Вы также можете полностью пропустить цикл for и просто распечатать его напрямую, что проще и эффективнее:
источник
Эта функция делает больше, чем вам строго требуется, поддерживая отрицательный шаг и т. Д. До тех пор, пока вы не учитываете логику диапазона, вам не нужно отдельное
day_count
и, что самое важное, код становится проще для чтения при вызове функции из нескольких мест.источник
Это самое понятное человеку решение, которое я могу придумать.
источник
Почему бы не попробовать:
источник
Функция Numpy
arange
может быть применена к датам:Использование
astype
заключается в преобразовании изnumpy.datetime64
в массивdatetime.datetime
объектов.источник
dates = np.arange(d0, d1, dt).astype(datetime.datetime)
Показать последние n дней с сегодняшнего дня:
Вывод:
источник
print((datetime.date.today() + datetime.timedelta(i)).isoformat())
print((datetime.date.today() + datetime.timedelta(i)))
без .isoformat () дает точно такой же вывод. Мне нужен мой скрипт для печати YYMMDD. Кто-нибудь знает, как это сделать?d = datetime.date.today() + datetime.timedelta(i); d.strftime("%Y%m%d")
источник
источник
Для полноты, у Панд также есть
period_range
функция для временных отметок, которые находятся за пределами:источник
У меня похожая проблема, но мне нужно повторять ежемесячно, а не ежедневно.
Это мое решение
Пример № 1
Вывод
Пример № 2
Вывод
источник
Может
«т* считаю , этот вопрос существует уже 9 лет никто не предлагая простую рекурсивную функцию:Вывод:
Редактировать: * Теперь я могу в это поверить - см. Оптимизирует ли Python хвостовую рекурсию? , Спасибо, Тим .
источник
Вы можете создать серию дат между двумя датами, используя библиотеку панд просто и надежно
Вы можете изменить частоту генерации дат, установив freq как D, M, Q, Y (ежедневно, ежемесячно, ежеквартально, ежегодно).
источник
источник
Эта функция имеет некоторые дополнительные функции:
проверка ошибок в случае, если конец старше, чем начало
источник
Вот код для общей функции диапазона дат, похожий на ответ Бер, но более гибкий:
источник
Как насчет следующих действий для увеличения диапазона по дням:
Для общей версии:
Обратите внимание, что .total_seconds () поддерживается только после Python 2.7. Если вы застряли в более ранней версии, вы можете написать свою собственную функцию:
источник
Немного другой подход к обратимым шагам путем хранения
range
аргументов в кортеже.источник
ВЫВОД:
источник