在Python中解析非零填充的时间戳

121 投票
5 回答
67423 浏览
提问于 2025-04-18 17:06

我想从像 3/1/2014 9:55 这样的时间戳中获取日期和时间,想用 datetime.strptime 或类似的方法。

这里的月份、日期和小时都没有用零填充,但在 这个链接 上似乎没有找到可以自动解析这种格式的指令。

有什么好的方法可以做到这一点吗?谢谢!

5 个回答

2

你可以在这里查看 strftime 的文档,不过实际上并不是所有的格式在所有平台上都能正常工作。比如说,%-d%-m 在 Windows 7 上用 Python 2.7 就不管用。所以你可以这样来实现

>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now())  
>>> print(date_str)
2016-5-23
4

我想这段回答可能对其他人有帮助——我来这里是因为我以为我遇到了零填充的问题,但实际上是关于12:00和00:00,以及%I格式化器的事。

%I格式化器是用来匹配12小时制的小时数,可以选择性地进行零填充。但是,根据你的数据来源,你可能会得到一些数据,表示午夜或中午实际上是零,比如:

>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'

其实strptime想要的是12,而不是零:

>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)

不过我们并不总是能控制我们的数据来源!我处理这个特殊情况的方法是捕获异常,尝试用%H来解析,并快速检查一下我们是否处于我们认为的特殊情况。

def get_datetime(string):
    try:
        timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
    except ValueError:
        # someone used zero for midnight?
        timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
        assert string.lower().endswith('am')
        assert timestamp.hour == 0
    return timestamp
4

一种不太常见的方法是使用 dateutil.parse 模块,它可以解析常见的日期格式,即使你不知道当前使用的是哪种格式也没关系。
例如:

>>> import dateutil.parser
>>> 
>>> utc_time     = '2014-08-13T00:00:00'
>>> verbose_time = '13-Aug-2014'
>>> some_locale  = '3/1/2014 9:55'
>>> dateutil.parser.parse(utc_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(verbose_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(some_locale)
datetime.datetime(2014, 3, 1, 9, 55)
10

strptime 不需要用零填充的值。下面是一个例子:

datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
output:   datetime.datetime(2014, 3, 1, 9, 55)
171

strptime 可以处理没有填充的值。这里提到的“填充”是指在格式代码表中对输出的描述,这个主要是针对 strftime 的输出结果来说的。所以你只需要使用下面的代码就可以了:

datetime.strptime(datestr, "%m/%d/%Y %H:%M")

撰写回答