Рубрики
Без рубрики

Итализация через диапазон дат с DateTime Python

Вопрос, часто задаваемый на форумах программирования, касается использования и итерации дат в Python. Сегодня я хочу представить основы модуля The DateTime в Python, что позволит нам выводить диапазон дат, учитывая ввод даты и необходимое количество дней. Мы также посмотрим на создание … Итализация через ряд дат с DateTime Python Подробнее »

Автор оригинала: David Yeoman.

Вопрос, часто задаваемый на форумах программирования, касается использования и итерации дат в Python. Сегодня я хочу представить основы модуля The DateTime в Python, что позволит нам выводить диапазон дат, учитывая ввод даты и необходимое количество дней. Мы также посмотрим на создание списка объектов DateTime, позволяющие нам большую гибкость в сортировке и выводе конкретных последовательностей даты.

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

Стандартизированные форматы даты

Различные культуры представляют даты по-разному. Половина населения мира пишет даты как День, месяц, год ; Некоторые страны используют Год, месяц, день И другие используют Месяц, день, год Отказ

Международная организация по стандартизации (ISO) внедрена стандартным ISO 8601, требующим, что даты будут написаны от наиболее значимой до наименее значимой цифры, чтобы избежать путаницы. Используемый формат, следовательно, представлен как Yyyy-mm-dd hh: мм: ss Отказ Позже мы будем кодировать с помощью datetime Класс, и вы увидите этот формат в действии.

Теперь давайте понять, как компьютеры измеряют время

Большинство компьютерных систем используют систему Himejeeperting Time Время Unix или Эпоха Тим е И подсчитайте секунды из эпохи Unix, которая произвольно устанавливается в 00:00:00 UTC 1 января 1970 года. UTC означает скоординированное универсальное время, которое настало время на 0 градусов долготы.

В рамках Python мы можем узнать текущее количество секунд, так как время эпохи импортируем модуль времени и используя время класса (), как показано здесь.

import time

j = time.time()
print(j)

# Result
1620224781.2914214

Представляем модуль DateTime

Работа с датами и временем может быть расстраивающий опыт, что с прыжками лет и часовые пояса. У Python есть три модуля, называемые календарь , datetime и время которые уменьшают сложность значительно. На сегодняшние проблемы мы будем использовать только datetime модуль. Чтобы прочитать подробную глубину на модуле, следуйте по этой ссылке на python.org , где вы найдете гораздо больше информации, чем вам, вероятно, понадобится. Три наиболее распространенные классы datetime Модуль:

datetime.date () Этот класс использует Gregorian Calendar, который начал в 1582 году после небольшой корректировки к календарю Julian. Тем не менее, datetime.date () Предполагается, что Грегорианский календарь бесконечно простирается в прошлое и будущее, и он принимает атрибуты, год, месяц и день.

datetime.time () Этот класс не зависит от какого-либо конкретного дня и предполагает, что день состоит из 24 х 60 х 60 секунд и игнорирует скачок секунды. Он принимает атрибуты, час, минуту, вторую, микросекунду, и информацию о часовом поясе, сокращенные до Tzinfo Отказ

dateTime.dateTime () Этот класс является комбинацией двух классов выше и использует одни и те же атрибуты обоих. Из этих трех сегодня мы будем использовать datetime.date () и datetime.dateTime ( ).

Мы также использовали другой класс под названием datetime.timedelta () , который выводит продолжительность, показывающая разницу между двумя датами, временем или экземплярами TATETIME вплоть до разрешения микросекунда.

Положить его на практику

Давайте импортируем дату и datetime Классы и преобразуйте дату, чтобы увидеть вывод. Обратите внимание на порядок атрибутов, которые мы передаем на datetime () Отказ

from datetime import date,  datetime

a = datetime(2021, 5, 5)
print(a)

# Result
2021-05-05 00:00:00

Здесь есть две вещи, чтобы отметить здесь. Во-первых, вы можете увидеть формат даты ISO 8601, как описано ранее, а во-вторых, обратите внимание, что, поскольку мы не вводили никаких атрибутов на некоторое время, вывод по умолчанию на 00:00:00. Однако мы можем также ввести атрибуты времени.

from datetime import date,  datetime

a = datetime(2021, 5, 5, 16, 3, 26)
print(a)

# Result
2021-05-05 16:03:26

Мы конвертируем эту дату и время в меток времени, а затем покажу вам код, чтобы конвертировать его на дату, используя fromtimestamp класс.

from datetime import date,  datetime

a = datetime(2021, 5, 5, 16, 3, 26)
print(a)

b = datetime.timestamp(a)
print(b)

d = datetime.fromtimestamp(b)
print(d)

# Result
2021-05-05 16:03:26  # Date correctly formatted
1620227006.0  # Above date as timestamp
2021-05-05 16:03:26  # Timestamp converted back to date

Прежде чем мы перейдем к решению наших двух проблем, вот еще одна полезная информация. Как только у вас есть даты в правильном datetime Формат, вы можете добавить и вычесть их, чтобы получить точное количество дней, часов и минут истеклом. Смотрите следующий пример.

from datetime import date,  datetime

a = datetime(2021, 5, 5, 16, 3, 26)
print(a)

e = datetime(2020, 4, 10, 9, 52, 45)
print(e)

z = a - e
print(z)

# Result
2021-05-05 16:03:26
2020-04-10 09:52:45
390 days, 6:10:41  #  Days, hours and minutes between the two dates

Давайте перейдем к итерации через даты

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

Две вещи, чтобы отметить, первое, что мы используем только Дата () Класс в этом примере, как нам не нужен временной компонент в возвращенных значениях, а во-вторых, я уконул возвращенные значения в коде ниже, чтобы сохранить некоторое пространство.

from datetime import date, timedelta

first_date = date(2021, 5, 15)

duration = timedelta(days=30)

for d in range(duration.days + 1):
    day = first_date + timedelta(days=d)
    print(day)

# Result
2021-05-15 
2021-05-16 
2021-05-17 
2021-05-18 
2021-05-19 
… # Truncated to save space
2021-06-07 
2021-06-08 
2021-06-09 
2021-06-10
2021-06-11 
2021-06-12 
2021-06-13 
2021-06-14 

Так что происходит в этом для петли ? Мы создали длительность переменной, которая передается datetime.timedelta Объект, содержащий всего 30 дней в этом примере; Тем не менее, мы могли бы использовать любой из атрибутов, которые класс принимает. Мы использовали Срок. Денью создать диапазон для цикла. Не забудьте добавить + 1, чтобы убедиться, что вы получите последний день диапазона. Также, чтобы начать день после first_date Добавьте цифру 1 и запятую на индексацию диапазона:

for d in range(1, duration.days + 1):
    day = first_date + timedelta(days=d)
    print(day)

# Result
2021-05-16 
2021-05-17 etc

Затем следующая строка просто увеличивает первое свидание по дням на основе количества итераций и печатает полученную дату.

Если вы хотите отступить от даты начала и распечатать диапазон дат, предыдущий, измените символ + в уравнение в минус символ следующим образом.

for d in range(1, duration.days + 1):
    day = first_date - timedelta(days=d)
    print(day)

# Result
2021-05-15
2021-05-14
2021-05-13 etc

Этот пример решил нашу проблему, позволив нам итерацию через диапазон дат, учитывая начало или конечную точку. Теперь я покажу еще один пример некоторых кода, который содержит большую часть одной и той же логики, который мы только что видели, но он использует списки и понимание списков, которые могут лучше поднять ваше приложение. В этом примере еще раз мы дикторируем количество дней, которые нам нужен в качестве вывода, и мы создаем дату начала (или конца), используя либо Дата () или datetime () класс. Если вам не нужен элемент времени, используйте Дата () Как у меня есть. Затем мы пишем линейку кода, которая создает список, увеличивая базовую дату с помощью TimeDelta (Days = x) синтаксис. Использование TimeDelta необходимо, как следует попытаться увеличить эту базовую дату, используя целые числа, вы получите Типеррор Отказ Давайте посмотрим на вывод.

from datetime import date, timedelta

numdays = 30
base = date(2021, 5, 1)

date_list = [base + timedelta(days=x) for x in range(numdays)]

print(date_list)
# Result
[datetime.date(2021, 5, 1), datetime.date(2021, 5, 2), datetime.date(2021, 5, 3), datetime.date(2021, 5, 4), datetime.date(2021, 5, 5), datetime.date(2021, 5, 6), datetime.date(2021, 5, 7), datetime.date(2021, 5, 8), datetime.date(2021, 5, 9), datetime.date(2021, 5, 10), datetime.date(2021, 5, 11), datetime.date(2021, 5, 12), datetime.date(2021, 5, 13), datetime.date(2021, 5, 14), datetime.date(2021, 5, 15), datetime.date(2021, 5, 16), datetime.date(2021, 5, 17), datetime.date(2021, 5, 18), datetime.date(2021, 5, 19), datetime.date(2021, 5, 20), datetime.date(2021, 5, 21), datetime.date(2021, 5, 22), datetime.date(2021, 5, 23), datetime.date(2021, 5, 24), datetime.date(2021, 5, 25), datetime.date(2021, 5, 26), datetime.date(2021, 5, 27), datetime.date(2021, 5, 28), datetime.date(2021, 5, 29), datetime.date(2021, 5, 30)]

Что мы вернемся, это список datetime.date () Классы каждая из них увеличивается с базовой даты на один день. Этот метод может быть полезен, если вы хотите осуществить другие мероприятия, используя Понимание списка и Индексирование Отказ В противном случае, чтобы получить тот же выход, что и предыдущий пример, мы запускаем для петли. Еще раз я урезал результаты для пробела.

from datetime import date, datetime, timedelta

numdays = 30

base = date(2021, 5, 1)

date_list = [base + timedelta(days=x) for x in range(numdays)]

for i in date_list:
    print(i)

# Result
2021-05-01
2021-05-02
2021-05-03
2021-05-04
2021-05-05
2021-05-06
2021-05-07
2021-05-08
… # Truncated to save space
2021-05-24
2021-05-25
2021-05-26
2021-05-27
2021-05-28
2021-05-29
2021-05-30

Опять же, чтобы отменить назад с базовой даты, измените "[База +) ..." оператор в вычитание, а не дополнение.

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

for i in date_list:
    print(i)

# Result
2021-05-01
2021-04-30
2021-04-29 etc

Резюме

Сегодня мы представили стандартизированные форматы даты и концепцию времени Unix.

Мы представили datetime Модуль в Python и использовал datetime Классы, Дата () , datetime () и TimEdelta () Выходные последовательные даты, заданные базовой датой, а количество необходимых дней.

Затем мы использовали Понимание списка Создать список, содержащий datetime.date () Классы с дневным атрибутом, увеличиваемым количеством дней, предусмотренные. Такой список может быть полезен для дальнейшей индексации или понимания списка.

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

Я надеюсь, что эта статья была полезной и предложит вам дополнительный эксперимент с datetime Модуль в Python. Спасибо за чтение.