2017-03-31 102 views
1

我有时间串记为“48米37S”,有时称为“1H38米-29”和字符串的集合持有熊猫数据帧的列转换大熊猫串柱ocassionally失踪小时部分为datetime

我这个数据“M试图持续时间列的数据类型转换为日期时间如下

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

但有下列错误而失败

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

据我所知,舒美特在duration列的列表条目中缺少小时部分,并且想知道是否有一种方法可以指定多种格式,以防万一其他成功匹配失败。

这样做将产生输出为下文列保存条目顺序

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

回答

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] 
+0

这将失败在OP的样本数据,也没有张贴代码片段,因为这不是对别人有用。您应该发布一个完整的代码示例,演示这适用于OP – EdChum

+0

这不会失败。 –

+0

对不起,我在我的数据中遗漏了's',重点仍然存在,请不要发布短代码片段,答案应该与样本数据,代码和产生的输出一起完整,因为它目前看起来像一条评论 – EdChum

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