Python 如何使用datetime查找平均时间?

Python 如何使用datetime查找平均时间?,python,datetime,average,Python,Datetime,Average,我试图找到存储我的datetime时间的列表的平均值 我已经尝试过获取列表的总和,但由于它是一个datetime模块,因此不起作用 finaltimes=[] 对于范围内的i(len(次)): 尝试: a=次[i] b=先前的_次[i] da=datetime.datetime.strtime(a,'%H:%M:%S') db=datetime.datetime.strtime(b,'%H:%M:%S') 打印(db-da) finaltimes.append(db-da) 我希望输出是00:

我试图找到存储我的
datetime
时间的列表的平均值

我已经尝试过获取列表的总和,但由于它是一个
datetime
模块,因此不起作用

finaltimes=[]
对于范围内的i(len(次)):
尝试:
a=次[i]
b=先前的_次[i]
da=datetime.datetime.strtime(a,'%H:%M:%S')
db=datetime.datetime.strtime(b,'%H:%M:%S')
打印(db-da)
finaltimes.append(db-da)

我希望输出是00:01:34。有什么帮助吗?

一种方法是将
datetime
对象转换为
utc
,平均它们,将最终的
utc
转换回
datetime
对象,就像这样-

导入日期时间
datetime.datetime.fromtimestamp((datetime.datetime(2012,4,1,0,0).timestamp()+datetime.datetime(2013,4,1,0,0).timestamp())/2)
#OP datetime.datetime(2012,9,30,11,0)

您可以使用这个。为了第一行的简洁,我刚刚从
datetime
导入了
datetime
。当您仅对时间使用
datetime.strtime
时,它将返回1970年1月1日的日期。
datetime
方法比
time
方法丰富得多,因此这里的输入和运算是用
datetime
完成的。您只需使用
strftime
输出不带日期的时间,就可以忽略这些日期。(注意:在Windows中,timestamp方法在1970年1月1日不起作用,因此我添加了一个hack,将日期强制为1月2日。只要这两次都这样做,它就可以正常工作)

下面是使用示例时间的核心代码,在交互模式下运行,输入已经完成

>>> ft = datetime.fromtimestamp((da.timestamp() + db.timestamp()) / 2)
>>> print(ft)
2019-07-23 00:02:52.500000
>>> print(ft.strftime("%H:%M:%S.%f"))
00:02:52.500000
>>> print(ft.strftime("%H:%M:%S.%f")[:11])
00:02:52.50

另一种方法如下。这一次,如果您只有HH:MM:SS格式,您可以对转换为秒的字符串使用算术运算。本例中的最后一个时间是字符串。您可以根据需要将它们转换为其他对象,如datetime或time对象。或者将其保留为秒数“
ts
,等等

from operator import mul
finaltimes = []
for i in range(len(times)):
    a = times[i]
    b = prior_times[i]

    as = sum(map(operator.mul, (int(x) for x in a.split(":")), (3600, 60, 1)))
    bs = sum(map(operator.mul, (int(x) for x in b.split(":")), (3600, 60, 1)))
    ts = (as + bs) // 2

    finaltimes.append(f"{ts // 3600:02d}:{(ts % 3600) // 60:02d}:{ts % 60:02d}")

似乎收到此错误ft=datetime.fromtimestamp((da.timestamp()+db.timestamp())/2)AttributeError:module'datetime'没有属性'fromtimestamp',我的输入是00:03:34 00:02:11抱歉,我没有说清楚。但是我只有时间。。没有日期。时间保存在一个数组中。我想运行数组。取得平均水平。并打印伊托克。再次更新(不要忘记使用
from datetime import datetime
,以免得到您在第一条注释中报告的错误)。
time
方法提供的功能不多,因此更容易使用附加的日期进行计算,然后忽略它。您可以忽略日期并仅使用时间部分格式化输出。我一直收到以下错误:
error:ft=datetime.fromtimestamp((da.timestamp()+db.timestamp())/2)OSError:[Errno 22]无效参数
如果没有日期,我将如何执行此操作。只有时间戳。00:03:12 00:02:34很抱歉回来时出现了更多错误,但我现在得到了这个
code finaltimes.append(f{ts//3600:02d}:{(ts%3600)//60:02d}:{ts%60:02d}”)value错误:类型为“float”的对象的未知格式代码“d”
可能是一个奇数秒,您正在平均并得到一个浮点值。尝试
ts=(as+bs)//2
将其截断为整数(答案已更新)。您一定发现了变量名中的输入错误。否则,如果您想要小数部分,那么您可以使用浮点格式作为ts,如
{ts%60:4.1f}
中所示,这只是给了我一个时间列表。我希望得到所有这些时间的平均值。再说一次,如果不清楚,很抱歉!!与示例代码一样,上面使用
ts=(as+bs)//2提供了
as
bs
的平均值。你在找别的东西吗?如果你在寻找一个较长列表的平均值,这是一个不同的问题,但不是特别难。你所需要做的就是使用相同的公式创建一个新列表,将时间转换为秒,求和并除以列表的长度。我希望得到它们的平均值,以便最终将其导出到csv文件
from operator import mul
finaltimes = []
for i in range(len(times)):
    a = times[i]
    b = prior_times[i]

    as = sum(map(operator.mul, (int(x) for x in a.split(":")), (3600, 60, 1)))
    bs = sum(map(operator.mul, (int(x) for x in b.split(":")), (3600, 60, 1)))
    ts = (as + bs) // 2

    finaltimes.append(f"{ts // 3600:02d}:{(ts % 3600) // 60:02d}:{ts % 60:02d}")