我抓取了一个跑步完成时间的数据集,其中包括跑步者在小时以下和小时以上的完成时间。小时以下的跑步者的编码类似于M:S,例如48:12跑完48分12秒的跑步者。小时以上的跑步者的编码类似于H:M:S,例如1:12:45。
是否可以将两种格式传递给datetime并将其全部编码为H:M:S?
我尝试过:
df['Time'] = pd.to_datetime(df['Time'],format="%H:%M:%S")
这(正确)给小时以下的跑步者带来了错误。
for obs in range(1,len(df)):
text = df.iloc[obs].loc['Time']
for fmt in ('%M:%S', '%H:%M:%S'):
try:
datetime.strptime(text, fmt)
except ValueError:
pass
raise ValueError('no valid date format found')
这将导致VALUE错误,找不到有效格式。
我希望解决方案可以用于不同的数据集,因此仅找到一个小时内的第一个跑步者并从那时起使用其他格式就行不通了。
答案 0 :(得分:0)
尝试一下:
df = pd.DataFrame({'Time': ['1:01:02', '3:20', 'xyz']})
tmp = (df.Time
.str.extract('(\d*):?(\d+):(\d+)$')
.replace('',0).astype(float)
)
给你
0 1 2
0 1.0 1.0 2.0
1 0.0 3.0 20.0
2 NaN NaN NaN
您可以通过以下方式获得总秒数:
tmp[0] * 3600 + tmp[1] * 60 + tmp[2]
从中,您可以将其转换为timedelta
类型。
答案 1 :(得分:0)
使用pd.to_timedelta
(或pd.to_datetime
),但首先通过适当地填充时间来确保时间为'HH:MM:SS`格式。
import pandas as pd
import numpy as np
df = pd.DataFrame({'Time': ['1', '8:12', '48:11', '1:12:13', '123:12:12']})
fill = '00:00:00'
s = df.Time.str.len()
pd.to_timedelta([fill[0:x] for x in np.clip(len(fill)-s, a_min=0, a_max=None)] + df.Time)
0 0 days 00:00:01
1 0 days 00:08:12
2 0 days 00:48:11
3 0 days 01:12:13
4 5 days 03:12:12
Name: Time, dtype: timedelta64[ns]