2016-11-22 72 views
0

我試圖將NewTime作爲OpenTimeCloseTime之間的中間值添加到我的數據框df1,它似乎不起作用。請參閱下面的代碼。有任何想法嗎?將派生的Timedelta添加到DateTime

>>> df1 = pd.DataFrame({'School': {0: 'ABC', 1: 'DEF', 2: 'GHI', 3: 'JKL', 4: 'MNO', 5: 'PQR'}, 'OpenTime': {0: '08:00:00.000', 1: '09:00:00.000', 2: '10:00:23.563', 3: '09:30:05.908', 4: '07:15:50.100', 5: '08:15:00.000'}, 'CloseTime': {0: '13:00:00.000', 1: '14:00:00.000', 2: '13:30:00.100', 3: '15:00:00.768', 4: '13:00:00.500', 5: '14:15:00.000'}, 'TimeZone':{0:'Europe/Vienna',1:'Europe/Brussels',2:'Europe/London',3:'Pacific/Auckland' ,4:'Asia/Seoul',5:'Europe/London'}}) 
>>> df1['OpenTime'] = pd.to_datetime(df1['OpenTime']) 
>>> df1['CloseTime'] = pd.to_datetime(df1['CloseTime']) 
>>> df1['Offset'] = df1.apply(lambda x:1/2*(x['CloseTime'] - x['OpenTime']), axis=1) 
>>> df1 
       CloseTime    OpenTime School   TimeZone Offset 
0 2016-11-22 13:00:00.000 2016-11-22 08:00:00.000 ABC  Europe/Vienna 0 days 
1 2016-11-22 14:00:00.000 2016-11-22 09:00:00.000 DEF Europe/Brussels 0 days 
2 2016-11-22 13:30:00.100 2016-11-22 10:00:23.563 GHI  Europe/London 0 days  
3 2016-11-22 15:00:00.768 2016-11-22 09:30:05.908 JKL Pacific/Auckland 0 days  
4 2016-11-22 13:00:00.500 2016-11-22 07:15:50.100 MNO  Asia/Seoul 0 days  
5 2016-11-22 14:15:00.000 2016-11-22 08:15:00.000 PQR  Europe/London 0 days  
>>> df1['NewTime'] = df1['OpenTime'] + df1['Offset'] 
>>> df1 
       CloseTime    OpenTime School   TimeZone Offset     NewTime 
0 2016-11-22 13:00:00.000 2016-11-22 08:00:00.000 ABC  Europe/Vienna 0 days 2016-11-22 08:00:00.000 
1 2016-11-22 14:00:00.000 2016-11-22 09:00:00.000 DEF Europe/Brussels 0 days 2016-11-22 09:00:00.000 
2 2016-11-22 13:30:00.100 2016-11-22 10:00:23.563 GHI  Europe/London 0 days 2016-11-22 10:00:23.563 
3 2016-11-22 15:00:00.768 2016-11-22 09:30:05.908 JKL Pacific/Auckland 0 days 2016-11-22 09:30:05.908 
4 2016-11-22 13:00:00.500 2016-11-22 07:15:50.100 MNO  Asia/Seoul 0 days 2016-11-22 07:15:50.100 
5 2016-11-22 14:15:00.000 2016-11-22 08:15:00.000 PQR  Europe/London 0 days 2016-11-22 08:15:00.000  
>>> 

但是,如果我從我的lambda功能刪除1/2這似乎是工作。所以基本上我無法將timedelta與任何數字相乘。

這是很重要的,我使用lambda功能,因爲我在做這個迭代產生多次(不只是midtime)

回答

1

你嘗試

df1['Offset'] = df1.apply(lambda x:((x['CloseTime'] - x['OpenTime']))/2, axis=1) 

我只是做了,在我的控制檯它運行良好。我假設把1/2放在前面是導致問題的原因。

+0

謝謝@DmitryPolonskiy。這工作。然而,可以說如果「OpenTime」或「CloseTime」的某個條目是「None」/「NaT」,那麼它會在lambda函數內引發跟隨錯誤。 'TypeError:(「不支持的操作數類型(s)爲/:'NaTType'和'int'」,發生在索引4處)' – Rahul

+0

這應該工作 '嘗試: df1 ['OffSet'] =(df1 ['CloseTime'] - df1 ['OpenTime'])/ 2 除了TypeError: pass' 編輯:當然如果您願意,也可以選擇刪除該行 –

相關問題