操纵时间字符串至毫秒精度



我在这里发现了很少的解决方案,所有这些都经常投票,但是当我尝试它们时,程序崩溃了。

因此,我想将字符串转换为DateTime对象,然后将其添加或减去它。所有字符串共享相同的结构 -> 00:00:40,249(示例(,标记00小时,00分钟40秒和249毫秒。当我将其转换为DateTime对象时,我会得到:

00:00:40.249000(额外的3个零标记微秒(。

我必须删除这3个零以获得相同格式的时间。

我发现的所有解决方案都非常直率。我的代码今天:

datetime.datetime.strptime(line.partition(saparator)[0], '%H:%M:%S,%f').time()

我发现的解决方案:

datetime.datetime.strptime(line.partition(saparator)[0], '%H:%M:%S,%f').time()[:-3]

当我这样做时,我会得到以下内容:

typeError:'dateTime.time'对象不可订阅

再次对这些解决方案进行了投票,并受到用户的感谢,我怎么不起作用?

谢谢大家!

您正在尝试切成DateTime对象而不是字符串。

TypeError: 'datetime.time'

您需要将变量施放为字符串,然后可以切片。

根据此处的文档:

time.isoformat()

这将返回时间为字符串。

这样的字符串看起来更像是经过的时间或时间间隔,至少对我而言。在这种情况下,我建议使用timedelta对象表示它。这样做的优点是,从中易于添加和减去任意时间间隔。

首先,转换:我选择使用正则表达式从字符串中拆分项目,但是当然,您可以使用最方便的任何技术。我首先在timedelta_args中为timedelta创建函数的所有参数创建一个字典。然后,我将本字典中的选定项目用我的字符串使用正则分析的值替换。然后,我将字典中的所有值传递给timedelta,注意将这些值按照此函数预期的顺序。我所希望的timespan的值,以及其属性的值。

>>> from datetime import timedelta
>>> import re
>>> s = '00:00:40,249'
>>> timedelta_args = {'days':0, 'seconds':0, 'microseconds':0, 'milliseconds':0, 'minutes':0, 'hours':0, 'weeks':0}
>>> timedelta_args['hours'], timedelta_args['minutes'], timedelta_args['seconds'], timedelta_args['milliseconds'] = map(int, re.split(r'[:,]', s))
>>> timespan = timedelta(*[timedelta_args[_] for _ in ['days', 'seconds', 'microseconds', 'milliseconds', 'minutes', 'hours', 'weeks']])
>>> timespan
datetime.timedelta(0, 40, 249000)
>>> timespan.seconds
40
>>> timespan.microseconds
249000

我可以轻松地获得timespan的字符串表示形式,只要毫秒的数量为1,000或更多,我就可以轻松地获得原始字符串。

>>> str(timespan)
'0:00:40.249000'
>>> str(timespan)[:-3]
'0:00:40.249'
>>> str(timespan)[:-3].replace('.', ',')
'0:00:40,249'

由于timespantimedelta,因此可以添加到它(并从中减去(。原始结果看起来可能不是很令人满意。但是,str功能很快弥补了这一点。

>>> timespan + timedelta(hours=3, seconds=20)
datetime.timedelta(0, 10860, 249000)
>>> str(timespan + timedelta(hours=3, seconds=20))
'3:01:00.249000'

格式化时要当心一个相当小的挂钩。当microseconds属性为零时,它完全将其留在字符串表示中。

>>> str(timespan + timedelta(hours=3, microseconds=751000))
'3:00:41'

最新更新