2017-10-05 64 views
0

不同的列我有一個DF拆分數據框列到基於狀態

id store_name open_timings 
1  abc  9 TO 1 -4 TO 11 
2  bcd  8 TO 11 - 1 TO 3 
3  xyz  8 TO 2 
4  qwe  9 TO 2-4 TO 7 

我要重新格式化該DF,這樣,我創建3組以上的列start_time,end_time,closed_time

id store_name start_time end_time closed_time 
1  abc   9    11   1-4 
2  bcd   8    3   11-1 
3  xyz   8    2   None 
4  qwe   9    7   2-4 

如果可能的話我可以轉換這列24小時格式,這樣的事情。

id store_name start_time end_time closed_time 
1  abc   9:00   11:00   13:00-16:00 
2  bcd   8:00   15:00   11:00 -13.00 
3  xyz   8:00   14:00   nan 
4  qwe   9:00   19:00   14:00-16:00 

第二部分是可選的,

有沒有什麼辦法讓這個?

我有辦法通過

df['temp1'], df['temp'] = df['open_timings'].str.split('-', 1).str 

到列open_timings分成2個,但不能讓過去那種。

回答

2

你可以做str.split即

ndf = df['open_timings'].str.split('TO',expand=True).rename(columns={0:"start_time", 1:'closed_time' , 2:'end_time'}) 
af = pd.concat([df,ndf],1) 
 
    id store_name  open_timings start_time closed_time end_time 
0 1  abc 9 TO 1 -4 TO 11   9  1 -4  11 
1 2  bcd 8 TO 11 - 1 TO 3   8  11 - 1   3 
2 3  xyz   8 TO 2   8   2  None 
3 4  qwe  9 TO 2-4 TO 7   9   2-4   7 

要刪除列,你可以做af = af.drop(['open_timings'],1)

closed_time有一些不確定性,但對start_timeend_time我們可以使用

for i in cols: 
    if i == 'start_time': 
     hr = 0 
    else: 
     hr = 12 
    af[i] = pd.to_datetime(af[i], format='%H') 
    af[i] = af[i].apply(lambda x : np.where(pd.isnull(x),np.nan,"{}:{}".format(x.hour+hr,x.minute))) 
 
    id store_name start_time closed_time end_time 
0 1  abc  9:0  1 -4  23:0 
1 2  bcd  8:0  11 - 1  15:0 
2 3  xyz  8:0   2  nan 
3 4  qwe  9:0  2-4  19:0 
+0

不錯,轉換爲時間格式,我應該使用pd.to_datetime? – Shubham

+0

不知道'am'或'pm'我們如何將它轉換爲24小時的日期時間。它造成了模糊性 – Dark

+0

這就是我認爲所有開始時間值都是AM,結束時間是PM,我不確定Closed_time部分 – Shubham