Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对Python的时间戳求和_Python_Datetime_Timedelta - Fatal编程技术网

如何对Python的时间戳求和

如何对Python的时间戳求和,python,datetime,timedelta,Python,Datetime,Timedelta,我正在使用糟糕的图书馆日期时间,我试图做应该很容易的事情。我的视频文件中有一组时间戳,我想简单地从结束时间减去开始时间,然后取所有时间和输出的总和,即视频文件的总时间。我的视频文件中的数据如下所示 <p begin="00:02:42.400" end="00:02:43.080" style="s2">product_1</p> 我想做的是不断地把“差异”加起来 我得到这个错误 UnboundLocalError:赋值前引用的局部变量“diff” 我认为错误是因为di

我正在使用糟糕的图书馆日期时间,我试图做应该很容易的事情。我的视频文件中有一组时间戳,我想简单地从结束时间减去开始时间,然后取所有时间和输出的总和,即视频文件的总时间。我的视频文件中的数据如下所示

<p begin="00:02:42.400" end="00:02:43.080" style="s2">product_1</p>
我想做的是不断地把“差异”加起来

我得到这个错误

UnboundLocalError:赋值前引用的局部变量“diff”

我认为错误是因为diff是datetime对象,而不是整数。但是当我做intdiff时,什么都不起作用

我怎样才能完成这个简单的任务?我很感激在这个烦人的问题上能得到的任何帮助


正如对原始问题的评论所说,使用 X+=Y 要求您已经定义了X

一个可能的解决办法是:

import datetime as dt

diff = dt.timedelta(0)  # Initialize the diff with 0

start_time = dt.datetime.strptime(begin, '%H:%M:%S.%f')
endie_time = dt.datetime.strptime(end, '%H:%M:%S.%f')

diff += endie_time-start_time  # Accumulate the time difference in diff 
由于您似乎希望迭代多个星号/结束日期:

import datetime as dt

diff = dt.timedelta(0)  # Initialize the diff with 0

for begin_i, end_i in zip(begin, end):

    start_time = dt.datetime.strptime(begin_i, '%H:%M:%S.%f')
    endie_time = dt.datetime.strptime(end_i , '%H:%M:%S.%f')

    diff += endie_time-start_time  # Accumulate the time difference in diff 

在上述两种情况下,差异将为dt.timedelta类型

这里的基本问题是datetime模块处理真实世界的挂钟时间,而您试图处理持续时间。datetime模块中唯一真正适用于适当处理问题的类是,它本质上表示持续时间。要将字符串解析为时间增量,您需要稍微手动执行以下操作:

>>> from datetime import timedelta
>>> h, m, s = '00:02:43.080'.split(':')
>>> timedelta(hours=int(h), minutes=int(m), seconds=float(s))
datetime.timedelta(seconds=163, microseconds=80000)
如果您现在有两个这样的时间增量,可以将其减去:

>>> end - start
datetime.timedelta(microseconds=680000)
您可以将它们添加到现有的timedelta中:

完整示例:

from datetime import timedelta

diff = timedelta()

def parse_ts(ts: str) -> timedelta:
    h, m, s = ts.split(':')
    return timedelta(hours=int(h), minutes=int(m), seconds=float(s))

timestamps = [('00:02:42.400', '00:02:43.080'), ...]

for start, end in timestamps:
    diff += parse_ts(end) - parse_ts(start)

print(diff)

因为您使用+=,所以需要给变量diff一个初始值。@Alanhaha当我使用diff=endie_time-start_time时,在我尝试diff++之后,它会说不支持的+:“int”和“datetime.timedelta”操作数类型。为什么要使用diff++?您的案例不需要它,对吗?Python的datetime库一点也不糟糕@kederrac

product_1

dt似乎在代码中同时引用了datetime.datetime和just datetime…?!请注意,如果您的时间戳超过24小时,这将中断。虽然这可能不是普通视频会遇到的典型问题,但这是使用datetime.datetime执行此任务的一个基本问题。关于dt reffering to datetime和datetime.datetime,您是对的,我在代码中更正了它。谢谢。我对24小时问题的观察很好。这似乎是来自开始和结束字符串的限制。我不知道是否有办法解决这个问题。是的,有。不要使用datetime来处理非挂钟时间。看见
diff = timedelta()
diff += end - start
from datetime import timedelta

diff = timedelta()

def parse_ts(ts: str) -> timedelta:
    h, m, s = ts.split(':')
    return timedelta(hours=int(h), minutes=int(m), seconds=float(s))

timestamps = [('00:02:42.400', '00:02:43.080'), ...]

for start, end in timestamps:
    diff += parse_ts(end) - parse_ts(start)

print(diff)