使用Python计算时差[重复]

Posted

技术标签:

【中文标题】使用Python计算时差[重复]【英文标题】:Calculate time difference using Python [duplicate] 【发布时间】:2014-07-16 03:04:57 【问题描述】:

我想知道是否有一种方法或内置库可以找到两个字符串输入的时间差异。

我的意思是,如果我有 2 个输入字符串:

    '2013-10-05T01:21:07Z' '2013-10-05T01:21:16Z'

如何计算时间差并将其打印为输出。

我知道这听起来有点傻,但感谢任何帮助。

【问题讨论】:

dateutil。你试过谷歌搜索吗? 我做的第一件事!我浏览了 datetime 模块和 time 模块,但找不到任何有用的东西。我对 python 比较陌生。 相关:How to parse ISO formatted date in python? How do I find the time difference between two datetime objects in python?的可能重复 【参考方案1】:

您似乎使用的是dateTime 格式的 ISO 8601。这种格式在很多地方都有使用,包括 GPS eXchange 格式。

[-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]

使用日期时间:

import datetime
a = datetime.datetime.strptime("2013-10-05T01:21:07Z", "%Y-%m-%dT%H:%M:%SZ")
b = datetime.datetime.strptime("2013-10-05T01:21:16Z", "%Y-%m-%dT%H:%M:%SZ")
c = b - a
print(c)

优点:

内置于 Python 标准库 面向对象的界面

缺点:

需要手动处理其他有效的 ISO 8601 表示,例如 '2013-10-05T01:21:16+00:00' 对于闰秒抛出异常,例如“2012-06-30T23:59:60Z”

使用 python-dateutil:

import dateutil.parser
a = dateutil.parser.parse("2013-10-05T01:21:07Z")
b = dateutil.parser.parse("2013-10-05T01:21:16Z")
c = b - a
print(c)

优点:

自动处理几乎任何时间格式

缺点:

需要 python-dateutil 库(pip install python-dateutil) 对于闰秒抛出异常,例如“2012-06-30T23:59:60Z”

按照Alfe 的建议使用 time.strptime 和 time.mktime

优点:

内置于 Python 标准库 可以解析闰秒,例如“2012-06-30T23:59:60Z”

缺点:

需要手动处理其他有效的 ISO 8601 表示,例如 '2013-10-05T01:21:16+00:00' 在“2012-06-30T23:59:60Z”和“2012-07-01T00:00:00Z”之间损失了一个闰秒(在不知道下一次闰秒何时发生的情况下这是不可避免的)

【讨论】:

你可以combine datetime (to get the difference) + time.strptime (to handle leap seconds)【参考方案2】:

使用strptime()解析你的字符串:

a = time.strptime('2013-10-05T01:21:07Z', '%Y-%m-%dT%H:%M:%SZ')
b = time.strptime('2013-10-05T01:21:16Z', '%Y-%m-%dT%H:%M:%SZ')

这会将给定的时间字符串解析为当地时间(将夏令时 (DST) 设置为自动),结果是时间结构。这些仍然反映 DST 是显式关闭 (0)、打开 (1) 还是隐式自动 (-1)。将这些转换为浮点数(自 1970-01-01 以来的秒数):

a = time.mktime(a)
b = time.mktime(b)

然后计算差异(以秒为单位):

d = b - a

并将它们转换为天/小时/分钟/秒:

days = int(d) / 86400
hours = int(d) / 3600 % 24
minutes = int(d) / 60 % 60
seconds = int(d) % 60

最后一个块仅适用于正差异,因此请注意不要交换 ab ;-)

但是@J.F.Sebastian 正确地指出这可能不是您想要的。从符号看来,您的字符串描述的是 UTC 时间,而不是本地时间。如果您的时间跨度在 DST 开关上,则仅对于时差是相关的。在这种情况下,当然会导致时差过大或过小一小时(因为 UTC 始终没有 DST)。

为避免这种情况,您可以将 DST 标志从自动 (-1) 设置为固定值(例如,0 表示关闭)并使用以下值:

a = time.mktime(a[:-1] + (0,))  # switch DST to off
b = time.mktime(b[:-1] + (0,))

或者,正如@J.F.Sebastian 指出的那样,您可以忘记time 模块,而使用不知道DST 方面的datetime.datetime

a = datetime.datetime.strptime('2013-10-05T01:21:07Z', '%Y-%m-%dT%H:%M:%SZ')
b = datetime.datetime.strptime('2013-10-05T01:21:16Z', '%Y-%m-%dT%H:%M:%SZ')

那么结果是datetime对象,可以直接减去它得到一个timedelta对象,它代表了你想要的时间差。打印它会得到像0:00:05 这样的东西,这很可能正是你要找的东西。

【讨论】:

效果很好。非常感谢。 输入是UTC时间。使用calendar.timegm() 而不是time.mktime()(否则在 DST 转换期间有 50% 的机会出错)。或者更好使用datetime.strptime()而不是time.strptime() 重点是:由于time.mktime() 的使用,您的答案可能会为某些输入返回错误结果,您可以使用calendar.timegm() 完全避免它。 取任何两个在解释为本地时间时具有 不同 utc 偏移量的时间点,例如,如果您的本地时区是 America/New_York,则基于 time.mktime() 的代码返回错误结果用于2015-11-01T00:00:00Z2015-11-01T06:00:00Z 输入。 感谢您指出这一点。我重写了部分答案。【参考方案3】:
import datetime
a = datetime.datetime.now()
b = datetime.datetime.now()
c = b - a
datetime.timedelta(0, 8, 562000)
divmod(c.days * 86400 + c.seconds, 60)

原答案 here

【讨论】:

从字符串中解析日期? 这不是 OP 要求的! 查看***.com/questions/9504356/… 实际上,我有 2 个 gps 跟踪点,格式为以米为单位的海拔高度、日期和时间、TrackPointId、以度为单位的纬度、以度为单位的经度。 1) 861.1,2013-10-05T01:21:28Z,3,13.348647,77.686088 2) 867,2013-10-05T01:29:03Z,4,13.34732,77.682364 我要计算这两个轨迹点的时差 那么你必须使用相对时间增量,这将更容易找到日期时间差异

以上是关于使用Python计算时差[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python:将字符串转换为日期时间,计算时差,选择时差超过3天的行

python 修正系统时差

带有时区信息的日期时间模块中的python timedelta计算[重复]

如何使用熊猫按组计算时差?

尝试使用子查询计算时差时出错

Python中特定年份的时差