【问题标题】:How to differentiate between a dateutil parsed date and a datetime with 0 for all time values如何区分 dateutil 解析日期和所有时间值都为 0 的日期时间
【发布时间】:2020-12-09 01:41:38
【问题描述】:

据我所知,一旦 dateutil 解析这两个日期字符串('2020-10-07'、'2020-10-07T00:00:00'),就无法区分它们。我真的希望能够区分独立日期和时间戳为零的日期。

import dateutil.parser
import datetime

date_str = '2020-10-07'
time_str = '2020-10-07T00:00:00'

s = dateutil.parser.parse(date_str)
e = dateutil.parser.parse(time_str)

最终目标是在一天结束时将时间设置为一天的开始,当它是一个独立的日期时,但在包含时间的情况下不考虑日期。接近这样的事情,但它仍然无法与这种情况区分开来。如果您知道任何对此非常有帮助的好的解决方案。

if s == e and s.time() == datetime.time.min:
    e = datetime.datetime.combine(e, datetime.time.max)

Post 有点用,但它已经过时了,我什至不确定它是否适用于我的用例。 Finding if a python datetime has no time information

【问题讨论】:

  • 为什么不直接分析字符串呢?例如如果它使用特定指令解析为日期时间?不知道你为什么必须首先在这里使用dateutil;这些 ISO 格式字符串可以很好地解析标准库的 fromisoformat
  • 我不想使用纯字符串解析的主要原因是我想解决它比这更不那么脆弱和更灵活的解决方案。需要 dateutil 的原因实际上是为了向后兼容,因此任何日期都不是严格的 iso 格式,一旦进行此更新,就不会停止工作。

标签: python-3.x datetime python-dateutil


【解决方案1】:

这是一个函数,它使用简单的 try/except 来测试输入是否可以解析为日期(即具有 no 时间信息)或日期时间对象(即 具有 em>时间信息)。如果输入格式与 ISO 格式不同,还可以实现特定的strptime directives

from datetime import date, time, datetime

def hasTime(s):
    """
    Parameters
    ----------
    s : string
        ISO 8601 formatted date / datetime string.

    Returns
    -------
    tuple, (bool, datetime.datetime).
        boolean will be True if input specifies a time, otherwise False.
    """
    try:
        return False, datetime.combine(date.fromisoformat(t), time.min)
    except ValueError:
        return True, datetime.fromisoformat(t)
        # do nothing else here; will raise an error if input can't be parsed

for t in ('2020-10-07', '2020-10-07T00:00:00', 'not-a-date'):
    print(t, hasTime(t))
    
# output:
# >>> 2020-10-07 (False, datetime.datetime(2020, 10, 7, 0, 0))
# >>> 2020-10-07T00:00:00 (True, datetime.datetime(2020, 10, 7, 0, 0))    
# >>> ValueError: Invalid isoformat string: 'not-a-date'

【讨论】:

  • 我认为这可能会起作用,我可以在 except 子句中使用 dateutil 来解决向后兼容性问题。
  • 我只想提醒任何使用 3.7 之前的 python 版本的人,这个 backport 给你 fromisoformat pypi.org/project/backports-datetime-fromisoformat
猜你喜欢
  • 1970-01-01
  • 2013-09-15
  • 2014-01-29
  • 2013-03-27
  • 2010-10-27
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多