python - 月/年字符串的 dateutil 解析器

标签 python datetime date-parsing python-dateutil

与这篇文章有点相关: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/

相关文章:

python - 在多索引数据框中创建不存在的列

python - 比较日期时间的异常值

javascript - 使用 moment.js 尝试在 native IOS 日历中创建事件

Javascript 转换时区问题

Java 日期解析器在时区 UT 和 UTC 上失败

java - 如何提取自定义格式的JSON数据?

python - 使用 pd.read_clipboard 指定多级列?

python - 在使用 Python 的 argparse 时知道用户是否指定了参数

Python 在不重新输入函数参数的情况下覆盖函数/方法

python - 在 Python 中为不同的日期格式创建一个解析函数