在python中将字符串解析为时间值

时间:2017-01-26 21:48:43

标签: python string datetime

我需要将以下字符串转换为日期时间或不同格式的字符串。我的输入看起来像这些例子:

  

196h 26m 13s
  95h 19m
  45分28秒

我想要的字符串输出是(但我的最终目标是将这些字符串转换为datetime个对象):

  

196:26:13个
  95:19:00
  零点45分28秒

在Excel中,它将是[h]:mm:ss

注意:如您所见,小时数可能高于24小时。

我试图用time.strptime()方法解析这个字符串,但它不适用于高于24的小时。我有一个正则表达式的解决方案,但我想知道是否有更直接的这样做的方式。解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

这会给你时间增量:

from datetime import timedelta

def to_timedelta(time_string):
    units = {'h': 'hours', 'd': 'days', 'm': 'minutes', 's': 'seconds'}
    return timedelta(**{units[x[-1]]: int(x[:-1]) for x in time_string.split()})

测试:

times = ['196h 26m 13s', '95h 19m', '45m 28s']
for t in times:
    print(to_timedelta(t))

输出:

8 days, 4:26:13
3 days, 23:19:00
0:45:28

timedelta接受这些论点;

  

datetime.timedelta(天= 0,秒= 0,微秒= 0,毫秒= 0,分钟= 0,小时= 0,周= 0)

使用此映射:

units = {'h': 'hours', 'd': 'days', 'm': 'minutes', 's': 'seconds'}

允许将字符串中的短单元映射到参数的相应名称。 使用Pythons **语法,结果字典可以用作单个参数,将转换为匹配的关键字参数。

答案 1 :(得分:1)

我们应该做的第一件事是使用正则表达式并使用timedelta而不是datetime。

import datetime
import re

regex = re.compile(r'((?P<hours>\d+?)h)?((?P<minutes>\d+?)m)?((?P<seconds>\d+?)s)?')

def parse_time(time_str):
    parts = regex.match(time_str)
    if not parts:
        return
    parts = parts.groupdict()
    time_params = {}
    for (name, param) in parts.items():
        if param:
            time_params[name] = int(param)
    return datetime.timedelta(**time_params)


L = ["196h 26m 13s", "95h 19m", "45m 28s"]

for l in L:
    print(parse_time(l))

输出:

8 days, 4:00:00
3 days, 23:00:00
0:45:00