与这篇文章有点相关:dateutil parser for month/year format: return beginning of month
给定一个格式为“Sep-2020”的日期字符串,dateutil.parser.parse
正确识别月份和年份,但也添加了日期。如果提供了默认值,则需要一天的时间。否则,它将只使用今天的一天。无论如何要判断解析器是否使用了任何默认术语?
例如,我如何从下面的三个选项中判断第一种情况下的输入日期字符串不包含日期并且使用了默认值?
>>> from datetime import datetime
>>> from dateutil import parser
>>> d = datetime(1978, 1, 1, 0, 0)
>>> parser.parse('Sep-2020', default=d)
datetime.datetime(2020, 9, 1, 0, 0)
>>> parser.parse('1-Sep-2020', default=d)
datetime.datetime(2020, 9, 1, 0, 0)
>>> parser.parse('Sep-1-2020', default=d)
datetime.datetime(2020, 9, 1, 0, 0)
``
最佳答案
我做了一些有点疯狂的事情来解决这个问题。这很疯狂,因为它不能保证与 dateutil
的 future 版本一起使用(因为它依赖于一些 dateutil 内部结构)。
目前我正在使用:python-dateutil 2.8.1
.
我编写了自己的类并将其传递为 default
到解析器:
from datetime import datetime
class SentinelDateTime:
def __init__(self, year=0, month=0, day=0, default=None):
self._year = year
self._month = month
self._day = day
if default is None:
default = datetime.now().replace(
hour=0, minute=0,
second=0, microsecond=0
)
self.year = default.year
self.month = default.month
self.day = default.day
self.default = default
@property
def has_year(self):
return self._year != 0
@property
def has_month(self):
return self._month != 0
@property
def has_day(self):
return self._day != 0
def todatetime(self):
res = {
attr: value
for attr, value in [
("year", self._year),
("month", self._month),
("day", self._day),
] if value
}
return self.default.replace(**res)
def replace(self, **result):
return SentinelDateTime(**result, default=self.default)
def __repr__(self):
return "%s(%d, %d, %d)" % (
self.__class__.__qualname__,
self._year,
self._month,
self._day
)
dateutils 方法现在返回这个 SentinelDateTime
类(class):
>>> from dateutil import parser
>>> from datetime import datetime
>>> from snippet1 import SentinelDateTime
>>>
>>> sentinel = SentinelDateTime()
>>> s = parser.parse('Sep-2020', default=sentinel)
>>> s
SentinelDateTime(2020, 9, 0)
>>> s.has_day
False
>>> s.todatetime()
datetime.datetime(2020, 9, 9, 0, 0)
>>> d = datetime(1978, 1, 1)
>>> sentinel = SentinelDateTime(default=d)
>>> s = parser.parse('Sep-2020', default=sentinel)
>>> s
SentinelDateTime(2020, 9, 0)
>>> s.has_day
False
>>> s.todatetime()
datetime.datetime(2020, 9, 1, 0, 0)
我把这个答案写成一个小包:https://github.com/foxyblue/sentinel-datetime
关于python - 月/年字符串的 dateutil 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65643971/