【问题标题】:How to find average time with datetime?如何找到日期时间的平均时间?
【发布时间】:2019-07-23 16:29:59
【问题描述】:

我正在尝试查找存储我的datetime 次的列表的平均值。

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

finaltimes = []
for i in range(len(times)):
    try:
        a = times[i]
        b = prior_times[i]

        da = datetime.datetime.strptime(a, '%H:%M:%S')
        db = datetime.datetime.strptime(b, '%H:%M:%S')

        print(db - da)
        finaltimes.append(db - da)

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

【问题讨论】:

    标签: python datetime average


    【解决方案1】:

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

    import 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)
    

    【讨论】:

    • 如果我没有日期,我该怎么做。只有时间戳。 00:03:12 00:02:34
    【解决方案2】:

    你可以使用它。为了简洁起见,我只从datetime 导入了datetime。当你只在时间上使用datetime.strptime 时,它会返回一个1970 年1 月1 日的日期。datetime 方法比time 方法丰富得多,所以这里的输入和运算都是用datetime 完成的。您可以只使用strftime 来输出不带日期的时间,以便它们在整个过程中被忽略。 (注意:在 Windows 中,时间戳方法不适用于 1970 年 1 月 1 日,因此我添加了一个 hack 以将日期强制为 1 月 2 日。只要两次都这样做,它将正常工作)。

    from datetime import datetime
    finaltimes = []
    for i in range(len(times)):
        try:
            a = times[i]
            b = prior_times[i]
    
            da = datetime.strptime(a, '%H:%M:%S').replace(day=2)
            db = datetime.strptime(b, '%H:%M:%S').replace(day=2)
    
            ft = datetime.fromtimestamp((da.timestamp() + db.timestamp()) / 2)
    
            print(ft)
            finaltimes.append(ft)
    

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

    >>> 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
    

    【讨论】:

    • 似乎收到此错误 ft = datetime.fromtimestamp((da.timestamp() + db.timestamp()) / 2) AttributeError: module 'datetime' has no attribute 'fromtimestamp'跨度>
    • 我的输入是 00:03:34 00:02:11
    • 对不起,如果我没有说清楚。但我只有时间.. 没有日期。时间保存在一个数组中。我想运行数组。取平均值。并打印出来
    • 好的。再次更新(不要忘记使用from datetime import datetime,以免收到您在第一条评论中报告的错误)。 time 方法提供的不多,因此使用附加日期进行计算更容易,然后忽略它。您可以忽略日期并仅使用时间部分格式化输出。
    • 我不断收到此错误:Error: ft = datetime.fromtimestamp((da.timestamp() + db.timestamp()) / 2) OSError: [Errno 22] Invalid argument
    【解决方案3】:

    另一种方法如下。这一次,如果您只有 HH:MM:SS 格式,您可以对转换为秒的字符串使用算术运算。此示例中的最后时间是字符串。您可以根据需要将它们转换为其他内容,例如日期时间或时间对象。或者将其保留为秒数 '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}")
    

    【讨论】:

    • 很抱歉出现更多错误,但我现在得到了这个code finaltimes.append(f"{ts // 3600:02d}:{(ts % 3600) // 60:02d}:{ts % 60:02d}") ValueError: Unknown format code 'd' for object of type 'float'
    • 可能是奇数秒,您正在平均并获得一个浮点数#。尝试ts = (as + bs) // 2 截断为整数(答案已更新)。您一定发现了变量名中的拼写错误。否则,如果您想要小数部分,那么您可以使用 ts 的浮点格式,如 {ts % 60:4.1f}
    • 这只是给我一个时间列表。我希望得到所有这些时间的平均值。再次,如果不清楚,对不起!
    • 以上提供了使用ts = (as + bs) // 2 的as 和bs 的平均值,与您的示例代码一样。你在寻找别的东西吗?如果您正在寻找更长列表的平均值,那是一个不同的问题,但并不是特别难。您需要做的就是使用相同的公式创建一个新列表,将时间转换为秒,将其相加并除以列表的长度。
    • 我有一个充满时间戳的数组。我希望得到它们的平均值,以便最终将其导出到 csv 文件
    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多