我在这里找到了解决问题的方法,所有这些解决方案都投了很多,但是当我尝试它们时,程序崩溃了。
所以,我想将一个字符串转换为一个日期时间对象,然后添加或减去它的时间。 所有字符串都具有相同的结构 - > 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'对象不可订阅
再一次,这些解决方案被投票赞成并得到了用户的非常感谢,我的工作怎么样?
谢谢大家!
答案 0 :(得分:1)
您正在尝试切片日期时间对象而不是字符串。
TypeError: 'datetime.time'
您需要将变量转换为String,然后才能对其进行切片。
根据文档here:
time.isoformat()
这将以字符串形式返回时间。
答案 1 :(得分:0)
这样的字符串看起来更像是经过的时间或时间间隔,至少对我而言。既然如此,我建议使用timedelta
对象来表示它。这样做的一个好处是可以轻松地从中添加和减去任意时间间隔。
首先转换:我选择使用正则表达式从字符串中拆分项目,但当然您可以使用您认为最方便的任何技术。我首先在timedelta
中为timedelta_args
创建函数的所有参数创建一个字典。然后我使用正则表达式将我在字符串中解析的值替换为此字典中的所选项。然后我将字典中的所有值传递给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'
由于timespan
是timedelta
我可以添加(并从中减去)。原始结果可能看起来不太令人满意;但是,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'