2015-04-07 5 views
1

Какую функцию я мог бы написать на python, чтобы определить, больше или нет дата для f, чем t, игнорируя компонент дня - что это очевидно?Определить больший месяц, игнорируя день

t = datetime.date(2014, 12, 30) 
f = datetime.date(2015, 1 ,2) 

Я попытался следующие:

if t.month > f.month: 

Однако, это не работает, поскольку она не учитывает год. Я хочу использовать год и месяц, а не дни.

Пожалуйста, обратите внимание, что «т» также может быть datetime.datetime(2015, 2, 2)

ответ

4

Вы могли бы сравнить даты с day компонентом, установленным в 1:

t.replace(day=1) < f.replace(day=1) 

или сравнить как год и месяц:

if t.year < f.year or (t.year == f.year and t.month < f.month): 

Последняя легче протестирована с сравнением кортежа:

if (t.year, t.month) < (f.year, f.month): 

Демо:

>>> from datetime import date 
>>> t = date(2015, 1, 2) 
>>> f = date(2015, 2, 2) 
>>> t.replace(day=1) < f.replace(day=1) 
True 
>>> t.year < f.year or (t.year == f.year and t.month < f.month) 
True 
>>> (t.year, t.month) < (f.year, f.month) 
True 
>>> t = date(2014, 12, 30) 
>>> f = date(2015, 1, 2) 
>>> t.replace(day=1) < f.replace(day=1) 
True 
>>> t.year < f.year or (t.year == f.year and t.month < f.month) 
True 
>>> (t.year, t.month) < (f.year, f.month) 
True 
+0

Спасибо, что ответили. Однако, если «t» должно быть «(2015, 2, 2)», то это не сработает. – NorthernStars

+0

@ Северные звезды: по сравнению с тем, что значение для 'f'? –

+0

if 'f' был еще (2015, 1, 2) – NorthernStars

0

Err ... Ничего плохого просто сравнивая даты напрямую?

>>> import datetime 
>>> t = datetime.date(2014, 12, 30) 
>>> f = datetime.date(2015, 1 ,2) 
>>> t > f 
False 
>>> t < f 
True 
>>> 

Теперь, если вы хотите две даты на тот же год и месяц для сравнения равно, просто сравнить год и месяц:

>>> t.strftime("%Y%m") <= f.strftime("%Y%m") 
True 
>>> g = datetime.date(2015, 1, 5) 
>>> g.strftime("%Y%m") > f.strftime("%Y%m") 
False 
>>> g.strftime("%Y%m") == f.strftime("%Y%m") 
True 

более просто (и дешевле):

>>> (t.year, t.month) <= (f.year, f.month) 
True 
>>> (g.year, g.month) == (f.year, f.month) 
True 
+0

вы быстрее меня на 7 секунд. – Ajay

+0

Да, потому что 'date (2014, 1, 2)' будет больше, чем 'date (2014, 1, 1)', но они находятся в том же месяце. В этом случае тест не сработает. –

+0

Спасибо за ответ. Я не хочу сравнивать даты непосредственно, поскольку я хочу сравнивать только месяцы. Причина, по которой мне нужно учитывать годы, состоит в том, что, например, jan 2013 больше, чем в декабре 2014 года. Однако, если сравнивать только месяцы, это будет выводиться как ложное, хотя это не – NorthernStars

0
from datetime import datetime 

t = datetime(2014, 12, 30) 
f = datetime(2015, 1 ,2) 

print t<f 
+0

Не делайте этого с 'datetime (2014, 12, 30)' и 'datetime (2014, 12, 31)'. И зачем использовать объекты 'datetime', когда OP хотел использовать объекты' date() '? Эти работы * просто отлично * для таких сравнений, за исключением того факта, что ни объекты 'datetime', ни дата' date 'игнорируют дату. –

Смежные вопросы