【问题标题】:how to convert datetime-like string into milliseconds如何将类似日期时间的字符串转换为毫秒
【发布时间】:2021-12-12 12:02:06
【问题描述】:

我有一个用户定义的函数 (return_times),它接受 json 文件并返回两个类似日期时间的字符串。

time_1, time_2= return_times("file.json")
print(time_1, time_2) # outputs: 00:00:11.352 00:01:51.936

我的意思是类似于日期时间的字符串00:00:11.352,它适合'%H:%M:%S.%f' 格式。但是,当我尝试将它们转换为毫秒时,我得到了负值。

from datetime import datetime

dt_obj_1 = datetime.strptime(time_1, '%H:%M:%S.%f')
start_ms = dt_obj_1.timestamp() * 1000

dt_obj_2 = datetime.strptime(time_2, '%H:%M:%S.%f')
end_ms = dt_obj_2.timestamp() * 1000

print(start_ms, end_ms ) # outputs: -2209019260648.0 -2209019160064.0

如果我成功了,我想使用以下命令修剪视频:

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
ffmpeg_extract_subclip("long_video.mp4", start_ms, end_ms, targetname="video_trimmed.mp4"), so just delete ` * 1000` part. 

注意ffmpeg_extract_subclip 要求其t1t2 参数以秒为单位,而不是我最初认为的以毫秒为单位。

由于这些负整数,我无法成功运行修剪过程。 我搜索了主要讨论年,月和日的几种格式的网络,但没有'%H:%M:%S.%f'

我可能会忽略什么?

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/a/59200108/2681662
  • 这看起来更像是一个时间,而不是日期和时间。还是您的意思是 timedelta,即持续时间?
  • 如果你碰巧使用pandaspd.to_timedelta("00:00:11.352").total_seconds()*1000

标签: python string datetime timedelta


【解决方案1】:

我可能会忽略什么?

time.strptime 文档

在更准确时用于填充任何缺失数据的默认值 无法推断值是(1900, 1, 1, 0, 0, 0, 0, 1, -1)

虽然纪元的开始是 1970 年。您可以通过计算您解析的内容和默认 strptime 之间的增量来获得您想要的结果,如下所示:

import datetime
time1 = "00:00:11.352"
delta = datetime.datetime.strptime(time1, "%H:%M:%S.%f") - datetime.datetime.strptime("", "")
time_s = delta.total_seconds()
print(time_s)

输出

11.352

【讨论】:

  • 这回答了我的主要问题,它解决了以毫秒为单位返回值的值。请注意,ffmpeg_extract_subclip 要求 t1t2 以毫秒为单位(正如我最初认为的那样)。 @Daweo,编辑您的答案,以秒为单位的 time_ms 而不是 ms。我也会对我的问题做同样的事情。
  • @bit_scientist 我编辑了我的答案,请注意虽然ffpmeg_extract_subclip 需要浮点数,但如果您直接(从命令行)使用ffmpeg,您可能会按原样使用00:00:11.352,请参见以下示例教程ottverse.com/…
【解决方案2】:

您需要将年份日期(年、月、日)添加到datetime,否则这将默认为 1900 年 1 月 1 日。

你要做的是:

from datetime import datetime
s = "00:00:11.352" 
f = '%H:%M:%S.%f'
datetime.strptime(s, f) # datetime.datetime(1900, 1, 1, 0, 0, 11, 352000)

一种方法是将日期字符串附加到您从return_times 收到的时间字符串中

【讨论】:

    【解决方案3】:

    来自https://stackoverflow.com/a/59200108/2681662

    1900 年早于the UNIX epoch 的开始,即 是在 1970 年,所以时间戳返回的秒数必须是 否定的。

    怎么办?

    最好使用time 对象而不是datetime 对象。

    from datetime import time
    
    time_1 = "00:00:11.352"
    hours, minutes, seconds = time_1.split(":")
    
    print(time(hour=int(hours), minute=int(minutes), second=int(float(seconds)),
               microsecond=int(float(seconds) % 1 * 1000000)))
    

    【讨论】:

    • 由于 OP 需要总(毫秒)秒,我认为您根本不需要 time 对象。此外,如果您将“秒”部分映射到浮点数,则已包含小数秒。
    • 我实际上尝试将秒数映射到float。然而time 对象期望值是intTypeError: integer argument expected, got float
    • 我认为time 对象会更好的原因是,在极端情况下datetime delta 对象可能有闰秒。
    • 重点是,输入代表一个持续时间,而不是一天中的某个时间。所以我认为时间或日期时间是不合适的数据结构。关于闰秒,另见docs,技术说明#4。
    【解决方案4】:

    您可以将时间字符串拆分为小时、分钟、秒和毫秒,通过一些简单的数学计算,您可以得到以毫秒为单位的全部时间

    【讨论】:

    • 实际上这是一个很好的方法(例如sum(a*b for a, b in zip(map(float, "00:00:11.352".split(':')), (3600, 60, 1)))。但是,您应该添加一个示例以使其成为一个有用的答案。否则,这应该是一个评论。
    • 对不起,我是 stackoverflow 的新手,没有添加评论所需的声誉。感谢您的建议
    • 我认为评论需要 40 个代表,所以你应该不会花太长时间到达那里。您还可以编辑您的答案以改进它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2012-07-29
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多