2017-07-05 85 views
2

我有一個DataFrame,它有一個開放時間和一個關閉時間,我試圖計算差值的毫秒數。熊貓指定Lambda函數

我的代碼是目前這樣的

df = df.assign(Latency=lambda d: d.CloseTimeStamp - d.CreationTimeStamp) 
df.Latency = df.apply(lambda d: d.Latency.total_seconds() * 1000., axis=1) 

不過,我想知道爲什麼當我嘗試後我不能做作爲一個班輪像這樣

df = df.assign(Latency=lambda d: (d.CloseTimeStamp - d.CreationTimeStamp).total_seconds() * 1000.) 

我得到AttributeError: 'Series' object has no attribute 'total_seconds'

+0

它是如何工作的? – jezrael

回答

1

總秒數是.dt屬性裏面,所以這應該工作:

df = df.assign(Latency=lambda d: (d.CloseTimeStamp - d.CreationTimeStamp).dt.total_seconds() * 1000.) 

Ha ving如此說,不需要lambda函數:

df = df.assign(Latency=(df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000.) 

要快得多。

對效率的進一步評論:df.assign()構建了一個全新的數據框對象;如果你打算到該對象分配放回df,你就要去修改就地df更好:

df['Latency'] = (df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000. 
1

極品.dt訪問,因爲datetime Series工作,.dt是省略如果DatetimeIndex

df = df.assign(Latency=lambda d: (d.CloseTimeStamp - d.CreationTimeStamp).dt.total_seconds() * 1000.) 

解決方案,而拉姆達:

df = df.assign(Latency=(df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000.) 

...和解決方案,而assign

df['Latency'] = (df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000.