Перейти к содержимому

Как сравнивать даты в python

  • автор:

Сравнение дат в datetime

Вы переводите формат datetime.datetime и datetime.date в строки (именно это делает метод strftime ), и потом их сравниваете. Разумеется, строка 09.11.2020 больше строки 05.07.3000 .

Сравнивать нужно непосредственно данные в форматах datetime:

dt.datetime.now() < dt.datetime(3000, 7, 5) # True 

UPDATE

Если вам изначально дана строка, то переведите ее в формат dateimte и сравнивайте:

import datetime as dt my_string = "07.02.3000" my_dt = dt.datetime.strptime(my_string, '%d.%m.%Y') print(my_dt > dt.datetime.now()) # True 

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

Сравнение дат и времени в Python - с часовыми поясами и без них

Введение При работе с датами часто бывает необходимо знать, наступает ли данная дата до или после другой даты. Мы можем получить эти ответы, сравнив даты. В этой статье мы узнаем, как использовать модуль Python datetime для создания и сравнения как простых (без информации о часовом поясе), так и известных (с информацией о часовом поясе) дат. Для сравнения дат мы будем использовать операторы сравнения в Python: <,>, ==, <=,> =,! =. Примечание. В модуле datetime есть два метода создания объекта даты - d

Время чтения: 4 мин.

Вступление

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

В этой статье мы узнаем, как использовать datetime для создания и сравнения как простых (без информации о часовом поясе), так и известных (с информацией о часовом поясе) дат.

Для сравнения дат мы будем использовать операторы сравнения в Python: , ==, =, != .

Примечание. В datetime есть два метода создания объекта даты - datetime.datetime и datetime.date . Сравнение может производиться только с объектами, созданными из одного и того же класса:

 datetime.datetime.now() >= datetime.date.today() 

Это приведет к TypeError :

 TypeError: can't compare datetime.datetime to datetime.date 

Сравнение наивных дат и времени по часовому поясу

Начнем со сравнения наивных дат , которые не имеют информации о часовом поясе. Во-первых, мы хотим импортировать модуль datetime

 from datetime import datetime, date 

Затем давайте сделаем несколько дат, которые мы сможем сравнить:

 date1 = date(1995, 3, 20) date2 = date(2020, 1, 1) dob_a = datetime(1995, 3, 20) dob_b = datetime(2020, 1, 1) 

Сравнить эти объекты так же просто, как сравнить, скажем, целые числа. Дата меньше другой, если ее время предшествует другому.

 print("date1 comes before date2?", date1 < date2) print("date1 comes after date2?", date1 >date2) print("date1 is equal to date2?", date1 == date2) 
 date1 comes before date2? True date1 comes after date2? False date1 is equal to date2? False 

Теперь вы обычно включаете эту логику в некоторые операторы управления потоком:

 if dob_a > dob_b: print("person a is older than person b") else: print("person b is older than person a") 
 person b is older than person a 

Сравнение дат и времени с учетом часового пояса

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

 from datetime import datetime import pytz # Create timezone objects for different parts of the world tz_ny= pytz.timezone('America/New_York') tz_lon = pytz.timezone("Europe/London") # Year, Month, Day, Hour, Minute, Second datetime = datetime(2010, 4, 20, 23, 30, 0) # Localize the given date, according to the timezone objects date_with_timezone_1 = tz_ny.localize(datetime) date_with_timezone_2 = tz_lon.localize(datetime) # These are now, effectively no longer the same *date* after being localized print(date_with_timezone_1) # 2010-04-20 23:30:00-04:00 print(date_with_timezone_2) # 2010-04-20 23:30:00+01:00 print(date_with_timezone_1 == date_with_timezone_2) 

Выполнение этого кода приводит к:

 False 

Пока это заявление:

 print(date_with_timezone_1 > date_with_timezone_2) 
 True 

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

 2010-04-20 23:30:00-04:00 # date_with_timezone_1 2010-04-20 23:30:00+01:00 # date_with_timezone_2 

Интуитивно кажется, что date_with_timezone_2 действительно больше date_with_timezone_1 . Но давайте посмотрим, как работает функция localize()

Здесь мы использовали pytz чтобы сделать наши наивные даты осведомленными. tz_ny объект часового пояса для Нью-Йорка (tz_ny) и объект часового пояса для Лондона ( tz_lon ).

Затем, чтобы ввести информацию о часовом поясе в наш datetime , мы запустили localize() и упаковали результат в date_with_timezone_1 и date_with_timezone_2 .

Мы поместили 23:30 в localize() , которая, в свою очередь, создала дату и время для 23:30 в Нью-Йорке и 23:30 в Лондоне соответственно. Чтобы добраться с 23:30 в Нью-Йорке до 23:30 в Лондоне, нужно добавить 4 часа. Прошло больше времени, чтобы добраться до Нью-Йорка до 23:30, чем до Лондона до 23:30. Таким образом, datetime, соответствующее Нью-Йорку в 23:30, больше, чем datetime, соответствующее Лондону в 23:30.

Помните об этом поведении при такой работе с часовыми поясами.

Однако стоит отметить, что сравнение известных дат с наивными датами приведет к ошибке:

 date_with_timezone = tz_ny.localize(datetime) print(datetime == date_without_timezone) 

Это приведет к следующей ошибке:

 TypeError: can't compare offset-naive and offset-aware datetimes 

Итак, чтобы сравнивать объекты datetime, оба объекта должны быть либо наивными, либо осведомленными.

Заключение

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

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

Licensed under CC BY-NC-SA 4.0

сравнение даты на python

вобщем есть поле в бд, там datetime а я хочу сравнить его с реальной датой и если она (год,месяц, день) совпадает делать действия , как сравнить датетайм с датой?

megido
30.06.11 16:57:18 MSK

Вот уеб-девелопмент уже давно отделили от нормальной разработки.

Когда уже тупых пистонеров отсадят?

anonymous
( 30.06.11 17:03:26 MSK )

>>> from datetime import date, datetime >>> datetime.today().date() == date.today() True

Это то, что тебе нужно было?

rival ★★
( 30.06.11 17:08:03 MSK )
Ответ на: комментарий от rival 30.06.11 17:08:03 MSK

чет не очень работает

megido
( 30.06.11 17:12:50 MSK ) автор топика
Ответ на: комментарий от megido 30.06.11 17:12:50 MSK

Тип DateTime преобразовывается в datetime.date, т.е. сравнивать нужно с datetime.date.today()

AlexKiriukha ★★★★
( 30.06.11 17:38:20 MSK )
Ответ на: комментарий от megido 30.06.11 17:12:50 MSK

скобочки после date нужно, это метод а не аттрибут.

provaton ★★★★★
( 30.06.11 17:43:27 MSK )
Ответ на: комментарий от provaton 30.06.11 17:43:27 MSK

под фильтр ниче не попадает

megido
( 30.06.11 17:53:14 MSK ) автор топика
Ответ на: комментарий от megido 30.06.11 17:53:14 MSK

а ты уверен что в БД есть записи с такой датой?

provaton ★★★★★
( 30.06.11 17:58:56 MSK )
Ответ на: комментарий от provaton 30.06.11 17:58:56 MSK

да, сегодня добавлял 1. 2011-06-30 12:05:14 2. 2011-06-30 12:05:25

megido
( 30.06.11 18:00:23 MSK ) автор топика
Ответ на: комментарий от megido 30.06.11 18:00:23 MSK

У меня для тебя два слова: datetime vs date.

baverman ★★★
( 30.06.11 18:07:13 MSK )
Ответ на: комментарий от baverman 30.06.11 18:07:13 MSK
megido
( 30.06.11 18:10:02 MSK ) автор топика
Ответ на: комментарий от megido 30.06.11 18:10:02 MSK

provaton ★★★★★
( 30.06.11 18:14:24 MSK )
Ответ на: комментарий от megido 30.06.11 18:10:02 MSK

Смотрите в самых хреновых кинотеатрах: «Школоло пытается сравнить datetime с date».

baverman ★★★
( 30.06.11 18:15:31 MSK )
Ответ на: комментарий от baverman 30.06.11 18:15:31 MSK

ты идиот, я спросил как и можна ли вобще , бо есть функция TO_DAYS() в mysql

megido
( 30.06.11 18:50:12 MSK ) автор топика
Ответ на: комментарий от megido 30.06.11 18:50:12 MSK

Умник, такой умник, ага.

baverman ★★★
( 30.06.11 18:56:05 MSK )
Ответ на: комментарий от megido 30.06.11 18:50:12 MSK

На пятом цикле потуг сравнить datetime vs date это заявление выглядит особенно пикантно. 😉

LamerOk ★★★★★
( 30.06.11 18:56:12 MSK )
Ответ на: комментарий от provaton 30.06.11 18:14:24 MSK

Join on field 'date' not permitted. Did you misspell 'date' for the lookup type? чет не так?

msgs=Message.objects.filter(date__date__gt=datetime.date(2011, 7, 30))

megido
( 30.06.11 18:56:41 MSK ) автор топика

Может проще в БД хранить unix-timestamp как INT UNSIGNED? А в Пистоне как-нибудь:

import time time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime(epoch)) (Replace time.localtime with time.gmtime for GMT time.) 

kovrik ★★★★★
( 30.06.11 19:01:54 MSK )
Ответ на: комментарий от megido 30.06.11 18:56:41 MSK

start_date = datetime.date(2011, 6, 30) end_date = datetime.date(2011, 6, 30) msgs=Message.objects.filter(date__gt=datetime.date(2011, 6, 30))

вот так работает

megido
( 30.06.11 19:02:17 MSK ) автор топика
Ответ на: комментарий от megido 30.06.11 19:02:17 MSK

эээ рано радуюсь, теперь фильтр так, для прикола, в выборку попал 2015 год

megido
( 30.06.11 19:05:44 MSK ) автор топика
Ответ на: комментарий от megido 30.06.11 18:56:41 MSK

start_date = datetime.date(2011, 6, 30) end_date = datetime.date(2012, 6, 30) msgs=Message.objects.filter(date__range=(start_date,end_date))

вот так точно работает, но как же настроить range считать включительно?

megido
( 30.06.11 19:14:27 MSK ) автор топика
Ответ на: комментарий от megido 30.06.11 17:53:14 MSK

> msgs=Message.objects.filter(date=datetime.datetime.today().date)

У тебя поле «date» (тот, что перед знаком равенства) имеет тип datetime, и тебе нужно отфильтровать один день, или, как ты выразился, сравнить с реальной датой (то есть типом date).
Представь себе, что вместо datetime у тебя действительные числа в БД, например, {1.4142, 2.7182, 3.0, 3.1415}. И ты хочешь выбрать все числа, у которых целая часть равна некоторому целому числу, к примеру, 3.

И тут есть два очевидных решения.
Первое. Ты можешь приводить каждое действительное число из БД к целому, отбрасывая дробную часть, и сравнивать с заданным целым числом ([1.4141] == 3, [2.7182] == 3, . ).
Но такое решение не подходит под твое API, так как ты не можешь ничего сделать с полем date (типа datetime ака «действительное») перед тем, как сравнивать с заданным числом, либо можешь, но не знаешь как (я тоже не знаю, for all I care, джанговский filter() составляет SQL запрос, то есть никаких значений у тебя еще нет на данный момент в питоне, а соответственно и преобразовывать из одного типа в другой пока еще нечего, а в таком случае тебе доступны только SQL функции, среди которых может оказаться и нужная: DATETIME => DATE).

Что же ты делаешь (в моей аналогии)? Ты берешь некоторое действительное число (datetime.today()), отбрасываешь его дробную часть (используя метод date()), после чего сравниваешь каждое действительное число из БД с тем целым числом, которое у тебя получилось (1.4141 == [3.5], 2.7182 == [3.5], . ). Естественно, это не то, что ты хочешь получить.

Дата и время в Python – подробно о модуле datetime

Python предоставляет модуль datetime для работы с реальными датами и временем. Приложения функционируют в режиме настоящего времени, и Python позволяет нам запланировать запуск нашего скрипта Python в определенное время. В Python дата не является типом данных, но мы можем работать с объектами даты, импортировав модуль с именем datetime, time и calendar.

В этом разделе руководства мы обсудим, как работать с объектами даты и времени в Python.

Классы datetime подразделяются на шесть основных:

  • date – имеет формат стандартной даты. Состоит из года, месяца и дня как атрибутов.
  • time – это точное время, предполагающее, что в каждом дне ровно 24 * 60 * 60 секунд. В качестве атрибутов у него есть часы, минуты, секунды, микросекунды и tzinfo.
  • datetime – это группировка даты и времени вместе с атрибутами год, месяц, день, час, минута, секунда, микросекунда и tzinfo.
  • timedelta – представляет разницу между двумя датами, временем или экземплярами datetime с точностью до микросекунд.
  • tzinfo – предоставляет объекты информации о часовых поясах.
  • timezone – включен в новую версию Python. Это класс, который реализует абстрактный базовый класс tzinfo.

Tick

В Python время отсчитывается с 12 часов утра 1 января 1970 года. Функция time() модуля time возвращает общее количество тиков, потраченных с 12:00 1 января 1970 года. Tick можно рассматривать как наименьшую единицу измерения времени.

Рассмотрим следующий пример.

import time; #prints the number of ticks spent since 12 AM, 1st January 1970 print(time.time())
1585928913.6519969

Как узнать текущее время?

Функции localtime() модуля времени используются для получения текущего кортежа времени. Рассмотрим следующий пример.

import time; #returns a time tuple print(time.localtime(time.time()))
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=3, tm_hour=21, tm_min=21, tm_sec=40, tm_wday=4, tm_yday=94, tm_isdst=0)

Кортеж времени

Время рассматривается как набор из 9 чисел. Давайте посмотрим на элементы временного кортежа.

Показатель Атрибут Значение
0 Год 4 цифры(например, 2018)
1 Месяц От 1 до 12
2 День От 1 до 31
3 Час От 0 до 23
4 Минуты От 0 до 59
5 Секунды От 0 до 60
6 День недели От 0 до 6
7 День года От 0 до 366
8 Перевод часов -1, 0, 1 или -1

Форматирование времени

Время можно отформатировать с помощью функции asctime() модуля времени. Он возвращает отформатированное время для переданного кортежа времени.

import time #returns the formatted time print(time.asctime(time.localtime(time.time())))
Tue Dec 18 15:31:39 2018

Время сна Python

Метод sleep() модуля time используется для остановки выполнения скрипта на заданный промежуток времени. Вывод будет задержан на количество секунд, указанное в качестве числа с плавающей запятой.

Рассмотрим следующий пример:

import time for i in range(0,5): print(i) #Each element will be printed after 1 second time.sleep(1)
0 1 2 3 4

Модуль datetime

Модуль datetime позволяет нам создавать настраиваемые объекты даты, выполнять различные операции с датами, такие как сравнение и т. д.

Чтобы работать с датами как с объектами даты, мы должны импортировать модуль datetime в исходный код Python.

Рассмотрим следующий пример, чтобы получить представление об объекте datetime для текущего времени.

import datetime #returns the current datetime object print(datetime.datetime.now())
2020-04-04 13:18:35.252578

Создание объектов даты

Мы можем создавать объекты даты, минуя желаемую дату в конструкторе datetime, для которой должны быть созданы объекты даты.

import datetime #returns the datetime object for the specified date print(datetime.datetime(2020,04,04))
2020-04-04 00:00:00

Мы также можем указать время вместе с датой для создания объекта datetime. Рассмотрим следующий пример.

import datetime #returns the datetime object for the specified time print(datetime.datetime(2020,4,4,1,26,40))
2020-04-04 01:26:40

В приведенном выше коде мы последовательно передали в функцию datetime() атрибуты года, месяца, дня, часа, минуты и миллисекунды.

Сравнение двух дат

Мы можем сравнить две даты, используя такие операторы сравнения, как>,> =,

from datetime import datetime as dt #Compares the time. If the time is in between 8AM and 4PM, then it prints working hours otherwise it prints fun hours if dt(dt.now().year,dt.now().month,dt.now().day,8)
fun hours

Модуль календаря

Python предоставляет объект календаря, который содержит различные методы для работы с календарями.

Рассмотрим следующий пример, чтобы распечатать календарь на последний месяц 2018 года.

import calendar; cal = calendar.month(2020,3) #printing the calendar of December 2018 print(cal)
March 2020 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Печать календаря на весь год в Python

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

import calendar #printing the calendar of the year 2019 s = calendar.prcal(2020)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *