【问题标题】:Determine larger month, ignoring the day确定较大的月份,忽略日期
【发布时间】:2015-04-07 11:21:27
【问题描述】:

我可以在 python 中编写什么函数来确定f 的日期是否大于t,忽略日期部分——显然是这样?

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

我尝试了以下方法:

if t.month > f.month:

但是,这不起作用,因为它没有考虑年份。我只想使用年份和月份,而不是日期。

请注意,“t”也可能是datetime.datetime(2015, 2, 2)

【问题讨论】:

    标签: python date datetime python-datetime


    【解决方案1】:

    您可以将日期与设置为1day 组件进行比较:

    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
    

    【讨论】:

    • 感谢您的回复。但是,如果 `'t' 是 '(2015, 2, 2)' 那么它就不起作用了。
    • @NorthernStars:与f 的值相比?
    • 如果 'f' 仍然是 (2015, 1, 2)
    • @NorthernStars:所有三个变体都适用于这些日期。你是如何测试这个的?
    • @NorthernStars:我可能对你的t.month &gt; f.month 测试感到困惑;仔细重新阅读您的问题,您想测试tf 之前,所以我颠倒了测试。
    【解决方案2】:
    from datetime import datetime
    
    t = datetime(2014, 12, 30)
    f = datetime(2015, 1 ,2)
    
    print t<f
    

    【讨论】:

    • datetime(2014, 12, 30)datetime(2014, 12, 31) 不能这样做。当 OP 想要使用 date() 对象时,为什么还要使用 datetime 对象?除了datetimedate 对象都不会忽略日期之外,这些方法很好进行此类比较。
    【解决方案3】:

    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
    

    【讨论】:

    • 你比我快7秒。
    • 是的,因为date(2014, 1, 2) 将比date(2014, 1, 1) 大,但它们在同一个月。对于这种情况,测试应该失败。
    • 感谢您的回答。我不想直接比较日期,因为我只想比较月份。我需要考虑几年的原因是因为,例如2013 年 1 月大于 2014 年 12 月。但是,如果只比较月份,这将输出为 false,即使它不是
    • @MartijnPieters:是的,我在发帖后理解了这一点——但感谢您指出。
    猜你喜欢
    • 2021-06-27
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多