将人类可读时间差(不是时间戳)转换为可用于排序的内容

时间:2016-02-22 02:57:39

标签: python python-2.7 datetime

我有一系列的时差,例如:

products(id, status, gender)

我希望将它们转换为绝对值,例如以秒为单位进行排序。是的,我可以编写自己的库,但我想知道是否已存在某些内容。

Google没有帮助,因为它的时间戳结果太多了。

1 个答案:

答案 0 :(得分:4)

Python有&#34; timedelta&#34; datetime模块中的类 - 它无法解析上面的数量,但您可以通过一些最小的解析创建timedelta对象,这些对象可以直接比较(并且可以直接添加和减去正常日期或日期时间对象); < / p>

In [1]: from datetime import timedelta
In [5]: x = timedelta(weeks=40)
In [6]: x
Out[6]: datetime.timedelta(280)
timedelta可能需要几周,几年,几天和几秒作为关键字参数,但不是几个月,因为它们的长度没有明确定义。此外,创建timedelta的最常用方法是减去两个日期(或日期时间)对象。

这个小函数利用你使用的时间单位几乎相同,被接受为timedelta构造函数来保存一些行来解析你的英语时差并用它们创建一个timedelta对象,使用正则表达式:< / p>

import re
from datetime import timedelta
def get_timedelta(line):
    timespaces = {"days": 0}
    for timeunit in "year month week day hour minute second".split():
        content = re.findall(r"([0-9]*?)\s*?" + timeunit, line)
        if content:
            timespaces[timeunit + "s"] = int(content[0])
    timespaces["days"] += 30 * timespaces.pop("months", 0) + 365 * timespaces.pop("years", 0)
    return timedelta(**timespaces)

使用您提供的示例,有一个:

In [26]: lines = """7 months
11 months                     
1 hour, 24 minutes
10 months, 3 weeks
1 year
1 year, 1 month
8 months, 2 weeks
2 months
2 months, 4 weeks
8 months, 1 week
9 months, 3 weeks""".split("\n")

In [27]: for line in lines:
    print(get_timedelta(line))
   ....:     
210 days, 0:00:00
330 days, 0:00:00
1:24:00
321 days, 0:00:00
365 days, 0:00:00
395 days, 0:00:00
254 days, 0:00:00
60 days, 0:00:00
88 days, 0:00:00
247 days, 0:00:00
291 days, 0:00:00