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

标签 python python-2.7 datetime

我有一系列时差,例如:

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/

相关文章:

python - 如何以编程方式设置交互参数?

python - 如何使用SQLAlchemy实现内连接?

python - Scrapy 获取所有子项/忽略 <br>?

r - 使用相同的引用比较组内的日期

SQL - 检索指定记录日期时间字段两侧 X 秒内出现的所有记录

python - 使用 Python 模块 main 函数进行验证测试是一个坏主意吗?

python - 使用 emacs 将 python 文档字符串突出显示为注释

php - 将 TIMESTAMP 和时区转换为不同的时区

python - 通过 Azure 数据工厂将数据复制到 Azure 数据湖之前进行文件检查

class - Python 全局对象变量