我有一个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
第二部分是可选的,
有没有办法解决这个问题?
我可以通过
将列open_timings
拆分为2
df['temp1'], df['temp'] = df['open_timings'].str.split('-', 1).str
但是不能过去。
答案 0 :(得分: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_time
和end_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