2017-03-31 101 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