将 pandas 字符串列转换为偶尔缺少小时部分的日期时间

Converting pandas strings column to datetime with ocassionally missing hour part

我将持续时间字符串标记为“48m 37s”,有时标记为“1h 38m 29s”,并在 pandas 数据框的列

中保存此数据的字符串集合

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

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

你需要:

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

更好用: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]