我有一个数据帧,它有一个打开时间和关闭时间,我正在尝试以毫秒为单位计算差异。
我的代码目前是这样的
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'
总秒数位于.dt
属性内,因此这应该有效:
df = df.assign(Latency=lambda d: (d.CloseTimeStamp - d.CreationTimeStamp).dt.total_seconds() * 1000.)
话虽如此,不需要 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.
需要.dt
访问器,因为使用datetime Series
,如果DatetimeIndex
,则省略.dt
:
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.