python - 人类可读的增量时间文本到 Python `timedelta`
问题描述
我已经看到了很多关于如何解析包含日期/时间的人类可读文本的示例,以datetime
构建自“纪元”以来的几秒钟。
一些 Pyhton 库(例如parsedatetime
或dateparser
声称能够解析相对日期/时间(例如“1 分 47 秒前”),但最终结果始终锚定到特定日期/时间。
使用两个提到的库的示例:
sdate="1 min 37 seconds ago"
dateparser.parse(sdate)
datetime.datetime(2019, 8, 19, 17, 20, 29, 325230)
pdtCal.parse(sdate)
(time.struct_time(tm_year=2019, tm_mon=8, tm_mday=19, tm_hour=17, tm_min=22, tm_sec=49, tm_wday=0, tm_yday=231, tm_isdst=-1), 2)
不过,我需要的是像一个timedelta
对象一样简单的东西,但从我能学到的东西来看,我能做的最好的事情就是通过从当前时间中timedelta
减去解析后的时间来计算 。datetime
显然,这不一样,因为我将添加一个采样错误(datetime.datetime.now()
在解析器运行的不同时间运行)。
所以我问,在 Python 中是否有一种简单而可靠的方法可以将这个增量时间文本直接解析为一个timedelta
对象或一个标量值(例如秒数)?
谢谢!
解决方案
有一种方法可以在dateparser
使用设置时指定“锚定日期” :
In [1]: from dateparser import parse
In [2]: from datetime import datetime
In [3]: anchor_date = datetime(2020, 1, 1)
In [4]: parsed_date = parse('1 min 37 seconds ago', settings={'RELATIVE_BASE': anchor_date})
In [5]: parsed_date - anchor_date
Out[5]: datetime.timedelta(days=-1, seconds=86303)
使用与相对基数相同的日期并在增量计算中确保精确的结果。
推荐阅读
- node.js - 如何处理“内容类型”:“应用程序/jwt”请求?
- haskell - 使用 LambdaCase 简化 zipWith 和 case
- python - 我正在尝试使用 oops 开发 tkinter 应用程序但收到此错误
- heroku - 使用静态 IP 将 Heroku 应用程序连接到 Atlas MongoDB
- javascript - 在功能组件之间传递表单数据
- android-management-api - 在应用程序策略中设置 minimumVersionCode 返回 503 Service Unavailable
- ruby-on-rails - Rspec未定义的方法`belong_to'
- asp.net - 如何修复 Asp.Net 中的 Core Web Vitals FID 问题?
- android - ListFiles() 仅显示文件夹但不显示文件 - AndroidStudio
- javascript - JavaScript 中 forEach() 循环中返回语句的意外行为