1

我将持续时间字符串记为“48m 37s”,有时记为“1h 38m 29s”,以及在熊猫数据框列中保存此数据的字符串集合

我正在尝试将持续时间列的数据类型转换为日期时间,如下所示

pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss')

但失败并出现以下错误

ValueError: time data '1h 38m 29s' does not match format '%Mm %Ss' (match)

我了解有时持续时间列的列表条目中缺少小时部分,并且想知道是否有一种方法可以指定多种格式,以防万一无法匹配其他格式。

这样做将产生如下输出,保留列中的条目顺序

     00:39:40
     01:38:29
     07:39:40
4

2 回答 2

1

你需要:

usg = pd.DataFrame({'duration':['7h 39m 40s','15h 39m 40s','39m 40s']})
print (usg)


usg['duration'] = np.where(usg.duration.str.contains('h'), 
                pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss', errors='coerce'),
                pd.to_datetime(usg['duration'], format='%Mm %Ss',errors='coerce'))
print (usg)
             duration
0 1900-01-01 07:39:40
1 1900-01-01 15:39:40
2 1900-01-01 00:39:40

另一种解决方案:

usg['duration'] = pd.to_datetime(usg['duration'].where(usg.duration.str.contains('h'), 
                                 '0h '+ usg['duration']),format='%Hh %Mm %Ss')
print (usg)
             duration
0 1900-01-01 07:39:40
1 1900-01-01 15:39:40
2 1900-01-01 00:39:40

usg.loc[~usg.duration.str.contains('h'), 'duration'] = '0h '+ usg['duration']
usg['duration'] = pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss')
print (usg)
             duration
0 1900-01-01 07:39:40
1 1900-01-01 15:39:40
2 1900-01-01 00:39:40
于 2017-03-31T13:07:34.050 回答
1

更好的使用:pd.to_timedelta(usg['duration'])

usg = pd.DataFrame({'duration': ['48m 37s', '1h 38m 29s']})

pd.to_timedelta(usg['duration'])

给出输出:

0   00:48:37
1   01:38:29
Name: duration, dtype: timedelta64[ns]
于 2017-03-31T13:20:50.577 回答