【问题标题】:How to provide default time when using datetime.strptime?使用 datetime.strptime 时如何提供默认时间?
【发布时间】:2019-10-14 17:51:55
【问题描述】:

我正在使用datetime.strptime从字符串中解析和获取日期时间值,格式为%Y-%m-%dT%H:%M:%SZ,但数据很脏,有时没有时间参数,有时在yyyy/mm/dd中接收格式而不是 yyyy-mm-dd 格式。我可以想到 hacky 正则表达式和 try-catch 方法来解析它并获得我需要的东西,但是有没有一种干净的方法来使用 datetime.strptime 并获取 '%Y-%m-%dT%H:%M 中的日期时间:%SZ' 格式为 00:00:00 或在没有时间信息的情况下作为默认时间?

目前在做:

time = datetime.strptime(data['time'], '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=pytz.utc)

如果数据格式不正确,则会引发错误。

【问题讨论】:

  • 脏数据会导致脏、不雅和 hacky 的代码。自从计算机存在以来,这是一条规则。又名“启发式解决方案”。

标签: python datetime strptime


【解决方案1】:

只需抓住ValueError 并使用增强值重试。

fmt = '%Y-%m-%dT%H:%M:%SZ'

try:
    time = datetime.strptime(data['time'], fmt)
except ValueError:
    time = datetime.strptime(data['time'] + "T00:00:00Z", fmt)

或者,尝试使用仅日期格式的相同字符串,因为结果值已经默认为 00:00:00。

date_and_time = '%Y-%m-%dT%H:%M:%SZ'
date_only = '%Y-%m-%d'
try: 
    time = datetime.strptime(data['time'], date_and_time)
except ValueError:
    time = datetime.strptime(data['time'], date_only)

第二种方法更容易适应多种可能的格式。制作一个列表,然后迭代它们直到成功。

formats = ['%Y-%m-%dT%H:%M:%SZ', '%Y-%m-%d', ...]
for fmt in formats:
    try:
        time = datetime.strptime(data['time'], fmt)
        break
    except ValueError:
        pass
else:
    # raise ValueError(f'{data["time"]} does not match any expected format')
    time = datetime.now()  # Or some other completely artificial value

【讨论】:

  • 一个非常好的方法,特别是循环解决方案
  • 是的,我想到了这样的事情,但想知道是否可能有一种不那么“变通/hacky”的方法,但看起来没有......谢谢你来回答! :)
【解决方案2】:

如果你对第三方依赖没问题,你也可以试试dateutil 库:

import dateutil.parser
time = parser.isoparse(data['time']).replace(tzinfo=pytz.utc)

或者,如果您想更好地控制默认值:

import dateutil.parser
time = parser.parse(data['time'], default=datetime.datetime(2019, 10, 14, 20, 14, 50), yearfirst=True).replace(tzinfo=pytz.utc)

它们都允许日期字符串中缺少更多字段(如YYYYYYYY-MM 等)。详情请见https://dateutil.readthedocs.io/en/stable/parser.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2019-09-08
    相关资源
    最近更新 更多