【问题标题】:finding the time difference for a string查找字符串的时差
【发布时间】:2020-03-04 09:53:29
【问题描述】:

在下面的字符串中

user: root sjc-array109-MGMT "nsstats  --var ds:diag:writeAdmitThrottleCount --from 2020-02-20,10:33:42 --to 2020-02-20,10:37:42 --interval 1 --diff

我要找时差

即 10:33:42 到 10:37:42 之间的差异

【问题讨论】:

  • 解析两个日期(正则表达式),转换为日期时间,用另一个日期时间减去一个日期时间,为您提供第三个日期时间,该日期时间具有差异。附言在 SO 中,我们会尽力帮助和指导您,而不是为您工作,因此请添加具体问题和/或信息,例如您尝试过的内容、您不了解的具体内容等。
  • 提供更多细节;字符串的格式是否总是相同的? “--from”总是在“--to”之前吗?它是 12 小时格式时间的 24 小时格式吗?如果是这样,您可以简单地使用正则表达式。
  • 字符串的格式总是一样的,格式是24小时

标签: python string datetime


【解决方案1】:

解析为datetime,然后只计算差值(datetime支持减法):

from dateutil.parser import parse
date_from = parse('2020-02-20,10:33:42'.replace(',', ' '))
date_to = parse('2020-02-20,10:37:42'.replace(',',  ' '))
diff = date_to - date_from
print(diff.total_seconds())

结果:240.0

我使用了.replace,因为dateutil 可以识别常见的日期时间格式——但里面的逗号不是标准的。你也可以使用your own time formatter with datetime.strptime (click for documentation)


编辑用于在字符串本身中查找日期:因为日期中没有空格,而且我很懒,不需要正则表达式的快速解决方案:

s = 'user: root sjc-array109-MGMT "nsstats  --var ds:diag:writeAdmitThrottleCount --from 2020-02-20,10:33:42 --to 2020-02-20,10:37:42 --interval 1 --diff ...'
s = s.split()
d = dict(zip(s, s[1:]))

date_from = parse(d['--from'].replace(',', ' '))
date_to = parse(d['--to'].replace(',', ' '))

diff = date_to - date_from
print(diff.total_seconds())

为什么这种惰性解决方案有效:

日期中没有空格,因此.split()(默认情况下以空格分隔)不会破坏日期。我们知道在某处有--from 后面跟着它的日期,而在某处有--to 后面跟着它的日期。

zip 从可迭代对象、第二个元素...等中生成第一个元素的元组。我使用[1:] 制作了没有第一个元素的副本。因此我们现在有一对 1st+2nd 元素,2nd+3rd,3rd+4th...

因此我们知道我们在某处有包含--from+其日期和--to+其日期的对。

所以我们应该寻找它。但同样,我很懒惰,我不想手动(循环)执行此操作。所以我做了一个字典 - 由对列表组成的字典,将第一个元素作为键,第二个元素作为值。

然后我们只查找我们的值 - 第一个元素是 --from--to,所以它们现在是键。

【讨论】:

  • 能否告诉我用正则表达式查找“​​--from”到“--interval”之间的字符串
  • 添加了比正则表达式更好的东西,可以在字符串中的任何位置与--from--to 一起使用。懒惰有它的好处——你可以找到更简单的解决方案。 :D
  • 谢谢你,我是 python 新手,肯定会学到更多,不会偷懒
  • 我不是说你懒,我说了我的解决方案,我就是!因为总是有一种粗暴的(直接的,手动的,因此非常通用的)方式来做它和一个聪明的(懒惰的,因为更少的编码和测试,有时需要一些解释,使用特定于问题的细节来为你带来优势)方式来做到这一点。你学得越多,你实际使用的那些“懒惰”(智能)解决方案就越多——因为 Python 语法通过它的功能元素鼓励了这一点!
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
相关资源
最近更新 更多