Python 将字符串列表转换为日期时间

Python 将字符串列表转换为日期时间,python,datetime,python-datetime,timedelta,Python,Datetime,Python Datetime,Timedelta,我正在尝试将字符串列表转换为datetime 下面是我正在处理的数据示例: x=['59:55:00','59:55:00','59:58:00','1:00:02','1:00:05','1:01:26'] 例如,该列表应该反映59分钟、58秒到1小时、0分钟和5秒 我知道这是一个古怪的格式,但我在玩我已经处理的手。我不确定当我进入大于59分钟的值时如何处理数据 我尝试使用: from datetime import datetime for i in x: datetime_obje

我正在尝试将字符串列表转换为datetime

下面是我正在处理的数据示例:
x=['59:55:00','59:55:00','59:58:00','1:00:02','1:00:05','1:01:26']

例如,该列表应该反映59分钟、58秒到1小时、0分钟和5秒

我知道这是一个古怪的格式,但我在玩我已经处理的手。我不确定当我进入大于59分钟的值时如何处理数据

我尝试使用:

from datetime import datetime
for i in x:
    datetime_object = datetime.strptime(i, '%M:%S:%f')
    print(datetime_object)
我的结果是:

1900-01-01 00:59:55
1900-01-01 00:59:55
1900-01-01 00:59:58
1900-01-01 00:01:00.020000
1900-01-01 00:01:00.050000
1900-01-01 00:01:01.260000
我想把我的输出保持在分和秒。 例如
1:01:26
将是
00:61:26

因此,我期望的输出如下所示:

1900-01-01 00:59:55
1900-01-01 00:59:55
1900-01-01 00:59:58
1900-01-01 00:60:02
1900-01-01 00:60:02
1900-01-01 00:61:26


非常感谢任何帮助或指导

可能
strtime
不是这里的正确工具(为了简洁起见,省略了一些错误检查):

>time=datetime.datetime.now()
>>>halfformatted=time.strftime('00:{minutes}:%S.%f')
>>>分钟总数=time.hour*60+time.min
>>>半格式化。格式化(分钟=分钟总数)
'00:358:33.339341'

如果保证数据不会返回到以前的格式,我们可以对其进行规范化。为了保持整洁,最好将其包装在生成器中,这样就不会使主要应用程序逻辑混乱。例如:

def标准化(次):
hms=错误
最后一分钟=0
对于x中的t:
h、 m,s=[int(i)表示t.split中的i(“:”)]
如果不是hms:
如果h<最后一分钟:
hms=真
其他:
h、 m,s=0,h,m
最后一分钟=m
收益率f'{h:02}:{m:02}:{s:02}'
x=['59:55:00','59:55:00','59:58:00','1:00:02','1:00:05','1:01:26']
对于标准化(x)中的v:
印刷品(五)
导致

00:59:55
00:59:55
00:59:58
01:00:02
01:00:05
01:01:26

现在,在循环中,您可以做任何您想做的事情。

datetime。datetime
对象必须采用一定范围内的参数,即分钟数必须介于
0
59
之间。但是,您可以创建一个类来处理此所需的行为。该类可以将输入转换为所需的时间戳格式,存储原始字符串,并提供一个
to_date
属性,以将实际时间戳检索为
datetime。datetime
对象:

import datetime

class Minutes:
  d = datetime.datetime.now()
  def __init__(self, _str, _year = None):
    self._val = _str
    d = datetime.datetime.now()
    self.year = _year if _year is not None else '-'.join(str(getattr(d, i)) for i in ['year', 'month', 'day'])
  @property
  def to_date(self):
    return datetime.datetime(*map(int, self.year.split('-')), *map(int, str(self).split(':')))
  def __str__(self):
    _h, _m, _s = map(int, self._val.split(':'))
    h, m, s = 0 if _h else _h, _m+(_h*60) if _h else _m, _s
    return f'{self.year} '+':'.join(str(i).zfill(2) for i in [h, m, s])
  def __repr__(self):
    return str(self)

x = ['59:55:00', '59:55:00', '59:58:00', '1:00:02', '1:00:05', '1:01:26']
new_x = [Minutes(i, '1900-01-01') for i in x]    
输出:

1900-01-01 00:59:55
1900-01-01 00:59:55
1900-01-01 00:59:58
1900-01-01 00:60:02
1900-01-01 00:60:05
1900-01-01 00:61:26
[1900-01-01 00:3595:00, 
 1900-01-01 00:3595:00, 
 1900-01-01 00:3598:00, 
 1900-01-01 00:60:02, 
 1900-01-01 00:60:05, 
 1900-01-01 00:61:26]

您的列表包含持续时间,而不是时间
datetime.timedelta
就是为了这个目的而设计的,但是如果您想要一个非常特定的字符串格式来输出,就没有必要了

输入数据的问题是格式不一致。如果您愿意硬编码第一部分的限制值,可以通过三元语句应用切换:

from datetime import timedelta

x = ['59:55:00', '59:55:00', '59:58:00', '1:00:02', '1:00:05', '1:01:26']

def converter(value, limit=59):
    var1, var2, var3 = map(int, value.split(':'))
    switch = var1 < limit
    mins = var1 * 60 + var2 if switch else var1
    secs = var3 if switch else var2
    return f'00:{mins:02}:{secs:02}'

res = list(map(converter, x))

print(res)
# ['00:59:55', '00:59:55', '00:59:58', '00:60:02', '00:60:05', '00:61:26']
从日期时间导入时间增量
x=['59:55:00','59:55:00','59:58:00','1:00:02','1:00:05','1:01:26']
def转换器(值,极限=59):
var1,var2,var3=map(int,value.split(':'))
开关=var1<极限
mins=var1*60+var2如果开关else var1
secs=var3如果开关else var2
返回f'00:{mins:02}:{secs:02}'
res=列表(映射(转换器,x))
打印(res)
# ['00:59:55', '00:59:55', '00:59:58', '00:60:02', '00:60:05', '00:61:26']

是否可以保证,一旦从%M:%S:%f转换到%H:%M:%S,它将不会返回到以前的格式?您的数据不明确@克里尚对如何消除歧义有一个好主意。但是您需要回答他的问题。您可以使用
timedelta
对象并使用
total_seconds()
方法来计算秒数、分钟数和小时数。@ChrisHunt数据不会返回到以前的格式
from datetime import timedelta

x = ['59:55:00', '59:55:00', '59:58:00', '1:00:02', '1:00:05', '1:01:26']

def converter(value, limit=59):
    var1, var2, var3 = map(int, value.split(':'))
    switch = var1 < limit
    mins = var1 * 60 + var2 if switch else var1
    secs = var3 if switch else var2
    return f'00:{mins:02}:{secs:02}'

res = list(map(converter, x))

print(res)
# ['00:59:55', '00:59:55', '00:59:58', '00:60:02', '00:60:05', '00:61:26']