<< ..

Python中转换字符串为时间类型

发布时间:

阅读《Python Cookbook》体验到了不一样的Python,坚持一日一读一练。

问题

当获取数据源后,经常会遇到字符串类型的时间表示形式,python的datetime库提供将字符串转换为时间类型的方法。

解决方案

使用datetimestrptime实现:

>>> from datetime import datetime
>>> text = '2017-06-29'
>>> convert_to_datetime = datetime.strptime(text, '%Y-%m-%d')
>>> now = datetime.now()
>>> diff = now - convert_to_datetime
>>> diff
datetime.timedelta(0, 34299, 56279)

strptime支持多种格式化字符成为时间的转义符,比如讲时间转为易读形式:

>>> now
datetime.datetime(2017, 6, 29, 9, 31, 39, 56279)
>>> stringify = datetime.strftime(now, '%A %B %d %Y')
>>> stringify
'Thursday June 29 2017'

More about datetime.strptime

Cookbook中提出strptime因为转换日期时候必须处理系统本地的设置,所以会存在性能问题。在遇到批量数据处理的时候,如果时间格式已经确定,最好使用自定义函数去处理,这里举个例子:

>>> from datetime import datetime
>>> text = '2017-06-29'
>>> def parse_ymd(s):
...     year, mon, day = s.split('-')
...     return datetime(int(year), int(mon), int(day))
...
>>> parse_ymd(text)
datetime.datetime(2017, 6, 29, 0, 0)

实际例子

ISODate的日期形式比较诡异:

"params" : {
    "endTime" : "2018-07-15T15:59:59.999Z",
    "startTime" : "2018-05-04T16:00:00.000Z",
    "classId" : "132a8012-2da0-11e8-9ec4-376c0342128a"
},

加入希望提取end - start计算间隔多久,精确到毫秒,需要先将时间作为字符处理:

start = datetime.strptime(params['startTime'].split('T')[0], '%Y-%m-%d')
end = datetime.strptime(params['endTime'].split('T')[0], '%Y-%m-%d')

然后根据total_seconds() * 1000得出毫秒级时间:

(end - start).total_seconds() *    1000

参考链接: