仅包含年份和月份的日期对象

时间:2013-01-20 13:46:50

标签: python date dictionary key

是否可以仅创建年份和月份的date对象?我不需要一天。

In [5]: from datetime import date

In [6]: date(year=2013, month=1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-a84d4034b10c> in <module>()
----> 1 date(year=2013, month=1)

TypeError: Required argument 'day' (pos 3) not found

我在我的字典中使用日期对象作为键,1月20日必须与1月21日具有相同的密钥,因为它们在同一个月和一年中。

之前我使用了一个简单的整数作为月份数字。不幸的是,我也需要知道这一年!

5 个答案:

答案 0 :(得分:13)

不,你不能这样做。对于您的用例,请改为使用元组:

key = (2013, 1)

由于您不需要对元组的值进行日期操作就足够了。

答案 1 :(得分:11)

作为其他答案的补充,您可以使用namedtuple。

from collections import namedtuple
MyDate = namedtuple('MyDate', ['month', 'year'])
dkey = MyDate(year=2013, month=1)

答案 2 :(得分:3)

return keys.Any(k => k.key == key && k.pressed);

答案 3 :(得分:2)

如果要使用datetime,则必须遵循其属性。我在官方网站上引用它:

  

“理想化的天真日期,假设当前的公历   永远是,而且永远都是,实际上。属性:年,月,   和白天。“

所以,你不能忽视一天,记得分配。

答案 4 :(得分:0)

这实现了一个类似于datetime.date的类,但是您无需指定日期。即,它允许您“仅使用年和月创建日期对象。”

class Mdate(datetime.date):
    """ A datetime.date where day doesn't matter. """

    def __new__(cls, year, month):
        """Python calls __new__ instead of __init__ for immutable objects."""
        return super().__new__(cls, year, month, 1)

    def __repr__(self):
        """Because you're implementing __new__ you also need __repr__ or else you get
        TypeError: __new__() takes 3 positional arguments but 4 were given."""
        return '{0}({1}, {2}, 1)'.format(self.__class__.__name__, self.year, self.month)

    def __reduce__(self):
        """You need __reduce__ to support pickling."""
        return (self.__class__, (self.year, self.month))

我有大量的代码,其中月份的哪一天与日期无关,因此从日期构造函数中删除日期就可以澄清该代码。

样品使用:

d = Mdate(2020, 12)