我有一系列时差,例如:
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
我想将它们转换为绝对值,例如出于排序目的以秒为单位。是的,我可以编写自己的库,但我想知道是否已经存在某些东西。
Google 没有提供任何帮助,因为它有太多时间戳结果。
最佳答案
Python 在 datetime 模块中具有“timedelta”类 - 它无法解析上述数量,但您可以通过一些最小的解析来创建可直接比较的 timedelta 对象(并且可以直接与正常值相加和相减)日期或日期时间对象);
In [1]: from datetime import timedelta
In [5]: x = timedelta(weeks=40)
In [6]: x
Out[6]: datetime.timedelta(280)
timedelta 可以采用周、年、日和秒作为关键字参数,但不能采用月份,因为它们的长度没有明确定义。此外,创建时间增量的最常用方法是减去两个日期(或日期时间)对象。
这个小函数利用了您使用的时间单位几乎与被接受为 timedelta 构造函数相同的时间单位来节省一些行来解析英语的时间差异并使用正则表达式从中创建 timedelta 对象:
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
关于python - 将人类可读的时间差(不是时间戳)转换为可用于排序的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35545091/